Re: ZSTD compression-level when CONFIG_MODULE_COMPRESS_ZSTD=y

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jul 30, 2024 at 6:44 PM Emil Velikov <emil.l.velikov@xxxxxxxxx> wrote:
>
> On Tue, 30 Jul 2024 at 01:51, Sedat Dilek <sedat.dilek@xxxxxxxxx> wrote:
> >
> > On Sat, Jul 27, 2024 at 12:18 AM Emil Velikov <emil.l.velikov@xxxxxxxxx> wrote:
> > >
> > > Hi Sedat, all,
> > >
> > > The mixed quoting is confusing me a bit, hopefully not to the point
> > > where I miss some questions.
> > >
> > > On Thu, 25 Jul 2024 at 21:00, Sedat Dilek <sedat.dilek@xxxxxxxxx> wrote:
> > > >
> > > > On Thu, Jul 25, 2024 at 9:23 PM Sedat Dilek <sedat.dilek@xxxxxxxxx> wrote:
> > > > >
> > > > > dileks@iniza:~/src/linux/git$ git grep zstd scripts/ | egrep '\-(19|22|T0)'
> > > > > scripts/Makefile.lib:      cmd_zstd = cat $(real-prereqs) | $(ZSTD) -19 > $@
> > > > > scripts/Makefile.lib:      cmd_zstd22 = cat $(real-prereqs) | $(ZSTD)
> > > > > -22 --ultra > $@
> > > > > scripts/Makefile.lib:      cmd_zstd22_with_size = { cat
> > > > > $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@
> > > > > scripts/Makefile.modinst:      cmd_zstd = $(ZSTD) -T0 --rm -f -q $<
> > > > >
> > > > > -sed@-
> > > > >
> > > > > On Thu, Jul 25, 2024 at 9:09 PM Sedat Dilek <sedat.dilek@xxxxxxxxx> wrote:
> > > > > >
> > > > > > Hi,
> > > > > >
> > > > > > I am a big fan of ZSTD - here version 1.5.6 on Debian/unstable AMD64.
> > > > > >
> > > > > > When playing with CONFIG_MODULE_COMPRESS_ZSTD=y I observed a 35MiB
> > > > > > greater linux-image Debian file.
> > > > > >
> > > > > > Debian: ~100MiB <--- CONFIG_MODULE_COMPRESS_XZ=y
> > > > > > Selfmade: ~135MiB <--- CONFIG_MODULE_COMPRESS_ZSTD=y
> > > > > >
> > > > > > So, I checked the used compression-level of ZSTD in the build-process:
> > > > > >
> > > > > > [ vmlinux.bin.zst ]
> > > > > > $ grep zstd build-log_6.10.1-1-amd64-clang18-kcfi.txt | grep vmlinux.bin.zst
> > > > > >  { cat arch/x86/boot/compressed/vmlinux.bin
> > > > > > arch/x86/boot/compressed/vmlinux.relocs | zstd -22 --ultra; printf
> > > > > > \370\040\157\003; } > arch/x86/boot/compressed/vmlinux.
> > > > > > bin.zst
> > > > > >
> > > > > > [ amdgpu.ko.zst ]
> > > > > > $ grep zstd build-log_6.10.1-1-amd64-clang18-kcfi.txt | grep '\-T0' |
> > > > > > grep amdgpu
> > > > > >  zstd -T0 --rm -f -q
> > > > > > debian/linux-image-6.10.1-1-amd64-clang18-kcfi/lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu.ko
> > > > > >
> > > > > > Here some numbers:
> > > > > >
> > > > > > [ Values in KiB ]
> > > > > > $ du -k amdgpu.ko*
> > > > > > 29264   amdgpu.ko
> > > > > > 5672    amdgpu.ko.zst <--- XXX: -T0
> > > > > > 4264    amdgpu.ko.zst_T0-19 <--- XXX:  -T0 -19
> > > > > > 4260    amdgpu.ko.zst_T0-22
> > > > > > 4308    amdgpu.ko.zst_T0-22-ultra
> > > > > >
> > > > > > $ time zstd -T0 -v amdgpu.ko
> > > > > > *** Zstandard CLI (64-bit) v1.5.6, by Yann Collet ***
> > > > > > Note: 2 physical core(s) detected
> > > > > > zstd: amdgpu.ko.zst already exists; overwrite (y/n) ? y
> > > > > > amdgpu.ko            : 19.38%   (  28.6 MiB =>   5.54 MiB, amdgpu.ko.zst)
> > > > > >
> > > > > > real    0m2,496s
> > > > > > user    0m0,448s
> > > > > > sys     0m0,064s
> > > > > >
> > > > > > $ time zstd -T0 -19 -v amdgpu.ko
> > > > > > *** Zstandard CLI (64-bit) v1.5.6, by Yann Collet ***
> > > > > > Note: 2 physical core(s) detected
> > > > > > amdgpu.ko            : 14.56%   (  28.6 MiB =>   4.16 MiB, amdgpu.ko.zst)
> > > > > >
> > > > > > real    0m22,821s
> > > > > > user    0m22,759s
> > > > > > sys     0m0,080s
> > > > > >
> > > > > > My wish is to use the zstd-option "-T0" (see vmlinux.bin.zst) everywhere.
> > > > > >
> > > > > > For CONFIG_MODULE_COMPRESS_ZSTD=y: Add compress-level = -19
> > > > > >
> > > > > > NOTE: -22 w/ or w/o ultra has no big effect here and increases even
> > > > > > more build-time.
> > > > > >
> > > > > > What do you think?
> > > > > >
> > > > > > Thanks.
> > > > > >
> > > > > > Best regards,
> > > > > > -Sedat-
> > > >
> > > > [ Adding some more folks - kmod / authors of commit c3d7ef377eb2
> > > > ("kbuild: add support for zstd compressed modules") ]
> > > >
> > > > Debian/unstable AMD54 ships kmod version 32+20240611-1.
> > > >
> > > > To use better/higher ZSTD compression-level for
> > > > CONFIG_MODULE_COMPRESS_ZSTD=y - do we need a newer KMOD version?
> > > >
> > > > DIFF for Linux-6.10.1:
> > > >
> > > > $ git diff scripts/Makefile.modinst
> > > > diff --git a/scripts/Makefile.modinst b/scripts/Makefile.modinst
> > > > index 0afd75472679..2a8b37c80cbf 100644
> > > > --- a/scripts/Makefile.modinst
> > > > +++ b/scripts/Makefile.modinst
> > > > @@ -146,7 +146,7 @@ quiet_cmd_gzip = GZIP    $@
> > > > quiet_cmd_xz = XZ      $@
> > > >       cmd_xz = $(XZ) --check=crc32 --lzma2=dict=1MiB -f $<
> > > > quiet_cmd_zstd = ZSTD    $@
> > > > -      cmd_zstd = $(ZSTD) -T0 --rm -f -q $<
> > > > +      cmd_zstd = $(ZSTD) -T0 -19 --rm -f -q $<
> > > >
> > > > $(dst)/%.ko.gz: $(dst)/%.ko FORCE
> > > >        $(call cmd,gzip)
> > > >
> > >
> > > The compression tools (zstd, xz, etc) are used predominantly for two
> > > separate topics - kernel image and kernel module compression.
> > >
> > > Off the top of my head: in the former case, reasonable compression is
> > > used by all tools. Be that zstd, lzo, lzma, you name it.
> > > Honestly I don't know why and what's the merit behind the levels chosen.
> > >
> > > In the modules case, things are also consistent where the default
> > > compression level is used throughout.
> > > Here it makes sense to keep the default since you can consider that
> > > the decompression can be done by either kernel or user-space. Where
> > > each comes with it's limitations:
> > >
> > > The in-kernel one does not support ultra levels for zstd (or it used
> > > to at some point) IIRC. The kmod tools themselves rely on the zstd
> > > library liked in, although if one is using busybox then zstd
> > > compressed modules were not supported last time I checked (a year or
> > > so ago).
> > >
> > > So for example: you can have zstd --22 modules, if the kernel + kmod
> > > are new enough (have in-kernel decompression) things will fail. If
> > > they're not, things will work just fine.
> > >
> > > Which is why, I think it's up-to your distro/builder to choose the
> > > policy. Here is what we've been using In Arch `ZSTD_CLEVEL=19 make ...
> > > modules_install`.
> > >
> > > Tl:Dr: You'd want to use `ZSTD_CLEVEL` (or equivalent if using xz)
> > > during make modules_install **depending** on the components used and
> > > their version.
> > >
> > > HTH
> > > Emil
> >
> > Hi Emil,
> >
> > Thanks for the explanations and infos.
> >
> > Sorry, for not being consistent with avoiding "top-posting".
> >
> > I took my LATEST selfmade 6.10.1 LLVM/Clang kernel and re-compressed via:
> >
> > root# zstd -T0 -19 -v *.ko
> >
> > [ SIZES ]
> >
> > 576     /lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/net/mac80211/mac80211.ko.zst
> > 752     /lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/net/mac80211/mac80211.ko.zst.orig
> >
> > 244     /lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko.zst
> > 316     /lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko.zst.orig
> >
> > 144     /lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/drivers/net/wireless/intel/iwlwifi/dvm/iwldvm.ko.zst
> > 184     /lib/modules/6.10.1-1-amd64-clang18-kcfi/kernel/drivers/net/wireless/intel/iwlwifi/dvm/iwldvm.ko.zst.orig
> >
>
> If you use the `ZSTD_CLEVEL=19 make modules_install ...` (somewhere in
> your Debian recipe) as mention earlier the extra re-compression should
> not be needed.
>

Hi Emil,

Is ZSTD_CLEVEL an Arch Linux specific variable?

git grep shows the usage of ... in the Linux-kernel source:

include/linux/zstd_lib.h:#  define ZSTD_CLEVEL_DEFAULT 3

I tried Linux v6.10.3 with my "[PATCH] kbuild: Use better
compress-level for zstd compressed modules"

Result: 25MiB smaller linux-image Debian package and same size
reduction in /lib/modules/.

Link: https://lore.kernel.org/all/CA+icZUUQadYjAXiCNx7PmKDV20WctvnzkXC3R2F7FM4Gzcm39Q@xxxxxxxxxxxxxx/

> > [ INSTRUCTIONS ]
> >
> > I stopped NetworkManager.service + networking.service + removed iwldvm
> > kernel-module (modprobe -r -v iwldvm).
> >
> > Compressed 3 kernel-modules (see above).
> >
> > Reloaded modified iwldvm (modprobe -v iwldvm) + started
> > networking.service + NetworkManager.service
> >
> > WIFI OK - Logs (dmesg) OK.
> >
> > So user-space works with kernel-space here on Debian/unstable AMD64.
> >
>
> Nice, so it's working as expected.
>
> Using level 19 level is safe assuming you don't use busybox initrd,
> with zstd compressed modules. Although you can use even higher level,
> if using kmod before commit 09c9f8c5df0475d2627d9498e26250592dbfebd6 -
> kmod v30 it seems.
>
> Since I'm not everyone is a Debian person, it'll be great to
> explicitly list the versions used ... for the future.
>
> If you have particular question/concern, let me know.
>

I can NOT say if some new KConfigs make sense here to check for
pre-requisites of specific versions of kmod/zstd/etc.
Introducing CONFIG_MODULE_COMPRESS_ZSTD_CLEVEL?

Thanks for your feedback.

-Sedat-





[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux