kbuild: handle module compression while running 'make modules_install'.
Since module-init-tools (gzip) and kmod (gzip and xz) support compressed
modules, it could be useful to include a support for compressing modules
right after having them installed. Doing this in kbuild instead of per
distro can permit to make this kind of usage more generic.
This patch add a Kconfig entry to "Enable loadable module support" menu
and let you choose to compress using gzip (default) or xz.
Both gzip and xz does not used any extra -[1-9] option since Andi Kleen
and Rusty Russell prove no gain is made using them. gzip is called with -n
argument to avoid storing original filename inside compressed file, that
way we can save some more bytes.
On a v3.16 kernel, 'make allmodconfig' generated 4680 modules for a
total of 378MB (no strip, no sign, no compress), the following table
shows observed disk space gain based on the allmodconfig .config :
| time |
+-------------+-----------------+
| manual .ko | make | size | percent
| compression | modules_install | | gain
+-------------+-----------------+------+--------
- | | 18.61s | 378M |
GZIP | 3m16s | 3m37s | 102M | 73.41%
XZ | 5m22s | 5m39s | 77M | 79.83%
The gain for restricted environnement seems to be interesting while
uncompress can be time consuming but happens only while loading a module,
that is generally done only once.
This is fully compatible with signed modules while the signed module is
compressed. module-init-tools or kmod handles decompression
and provide to other layer the uncompressed but signed payload.
Reviewed-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Bertrand Jacquin <beber@meleeweb.net>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Rusty Russell
parent
40e42f6a25
commit
beb50df39e
15
Makefile
15
Makefile
@@ -842,6 +842,21 @@ mod_strip_cmd = true
|
||||
endif # INSTALL_MOD_STRIP
|
||||
export mod_strip_cmd
|
||||
|
||||
# CONFIG_MODULE_COMPRESS, if defined, will cause module to be compressed
|
||||
# after they are installed in agreement with CONFIG_MODULE_COMPRESS_GZIP
|
||||
# or CONFIG_MODULE_COMPRESS_XZ.
|
||||
|
||||
mod_compress_cmd = true
|
||||
ifdef CONFIG_MODULE_COMPRESS
|
||||
ifdef CONFIG_MODULE_COMPRESS_GZIP
|
||||
mod_compress_cmd = gzip -n
|
||||
endif # CONFIG_MODULE_COMPRESS_GZIP
|
||||
ifdef CONFIG_MODULE_COMPRESS_XZ
|
||||
mod_compress_cmd = xz
|
||||
endif # CONFIG_MODULE_COMPRESS_XZ
|
||||
endif # CONFIG_MODULE_COMPRESS
|
||||
export mod_compress_cmd
|
||||
|
||||
# Select initial ramdisk compression format, default is gzip(1).
|
||||
# This shall be used by the dracut(8) tool while creating an initramfs image.
|
||||
#
|
||||
|
||||
43
init/Kconfig
43
init/Kconfig
@@ -1906,6 +1906,49 @@ config MODULE_SIG_HASH
|
||||
default "sha384" if MODULE_SIG_SHA384
|
||||
default "sha512" if MODULE_SIG_SHA512
|
||||
|
||||
config MODULE_COMPRESS
|
||||
bool "Compress modules on installation"
|
||||
depends on MODULES
|
||||
help
|
||||
This option compresses the kernel modules when 'make
|
||||
modules_install' is run.
|
||||
|
||||
The modules will be compressed either using gzip or xz depend on the
|
||||
choice made in "Compression algorithm".
|
||||
|
||||
module-init-tools has support for gzip format while kmod handle gzip
|
||||
and xz compressed modules.
|
||||
|
||||
When a kernel module is installed from outside of the main kernel
|
||||
source and uses the Kbuild system for installing modules then that
|
||||
kernel module will also be compressed when it is installed.
|
||||
|
||||
This option provides little benefit when the modules are to be used inside
|
||||
an initrd or initramfs, it generally is more efficient to compress the whole
|
||||
initrd or initramfs instead.
|
||||
|
||||
This is fully compatible with signed modules while the signed module is
|
||||
compressed. module-init-tools or kmod handles decompression and provide to
|
||||
other layer the uncompressed but signed payload.
|
||||
|
||||
choice
|
||||
prompt "Compression algorithm"
|
||||
depends on MODULE_COMPRESS
|
||||
default MODULE_COMPRESS_GZIP
|
||||
help
|
||||
This determines which sort of compression will be used during
|
||||
'make modules_install'.
|
||||
|
||||
GZIP (default) and XZ are supported.
|
||||
|
||||
config MODULE_COMPRESS_GZIP
|
||||
bool "GZIP"
|
||||
|
||||
config MODULE_COMPRESS_XZ
|
||||
bool "XZ"
|
||||
|
||||
endchoice
|
||||
|
||||
endif # MODULES
|
||||
|
||||
config INIT_ALL_POSSIBLE
|
||||
|
||||
@@ -22,7 +22,8 @@ quiet_cmd_modules_install = INSTALL $@
|
||||
mkdir -p $(2) ; \
|
||||
cp $@ $(2) ; \
|
||||
$(mod_strip_cmd) $(2)/$(notdir $@) ; \
|
||||
$(mod_sign_cmd) $(2)/$(notdir $@) $(patsubst %,|| true,$(KBUILD_EXTMOD))
|
||||
$(mod_sign_cmd) $(2)/$(notdir $@) $(patsubst %,|| true,$(KBUILD_EXTMOD)) ; \
|
||||
$(mod_compress_cmd) $(2)/$(notdir $@)
|
||||
|
||||
# Modules built outside the kernel source tree go into extra by default
|
||||
INSTALL_MOD_DIR ?= extra
|
||||
|
||||
Reference in New Issue
Block a user