lkml.org 
[lkml]   [2024]   [Mar]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/11] xz: Use 128 MiB dictionary and force single-threaded mode
    Date
    This only affects kernel image compression, not any other xz usage.

    Desktop kernels on x86-64 are already around 60 MiB. Using a dictionary
    larger than 32 MiB should have no downsides nowadays as anyone building
    the kernel should have plenty of RAM. 128 MiB dictionary needs 1346 MiB
    of RAM with xz versions 5.0.x - 5.6.x in single-threaded mode. On archs
    that use xz_wrap.sh, kernel decompression is done in single-call mode so
    a larger dictionary doesn't affect boot-time memory requirements.

    xz >= 5.6.0 uses multithreaded mode by default which compresses slightly
    worse than single-threaded mode. Kernel compression rarely used more
    than one thread anyway because with 32 MiB dictionary size the default
    block size was 96 MiB in multithreaded mode. So only a single thread
    was used anyway unless the kernel was over 96 MiB.

    Comparison to CONFIG_KERNEL_LZMA: It uses "lzma -9" which mapped to
    32 MiB dictionary in LZMA Utils 4.32.7 (the final release in 2008).
    Nowadays the lzma tool on most systems is from XZ Utils where -9 maps
    to 64 MiB dictionary. So using a 32 MiB dictionary with CONFIG_KERNEL_XZ
    may have compressed big kernels slightly worse than the old LZMA option.

    Comparison to CONFIG_KERNEL_ZSTD: zstd uses 128 MiB dictionary.

    Reviewed-by: Jia Tan <jiat0218@gmail.com>
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    ---
    scripts/xz_wrap.sh | 13 ++++++++++++-
    1 file changed, 12 insertions(+), 1 deletion(-)

    diff --git a/scripts/xz_wrap.sh b/scripts/xz_wrap.sh
    index bb760b721b2c..c8c36441ab70 100755
    --- a/scripts/xz_wrap.sh
    +++ b/scripts/xz_wrap.sh
    @@ -16,4 +16,15 @@ case $SRCARCH in
    sparc) BCJ=--sparc ;;
    esac

    -exec $XZ --check=crc32 $BCJ --lzma2=$LZMA2OPTS,dict=32MiB
    +# Use single-threaded mode because it compresses a little better
    +# (and uses less RAM) than multithreaded mode.
    +#
    +# For the best compression, the dictionary size shouldn't be
    +# smaller than the uncompressed kernel. 128 MiB dictionary
    +# needs less than 1400 MiB of RAM in single-threaded mode.
    +#
    +# On the archs that use this script to compress the kernel,
    +# decompression in the preboot code is done in single-call mode.
    +# Thus the dictionary size doesn't affect the memory requirements
    +# of the preboot decompressor at all.
    +exec $XZ --check=crc32 --threads=1 $BCJ --lzma2=$LZMA2OPTS,dict=128MiB
    --
    2.44.0

    \
     
     \ /
      Last update: 2024-05-27 15:56    [W:4.125 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site