Re: [PATCH] Compress kernel modules on installation.

Steve Brokenshire
2009-01-26T21:39:47Z

On Sun, 25 Jan 2009 19:02:21 +0100 (CET)
Jan Engelhardt <jengelh@medozas.de> wrote:

>
> On Sunday 2009-01-25 17:51, Steve Brokenshire wrote:
> >+
> >+quiet_cmd_modules_install = INSTALL $@
> >+ cmd_modules_install = mkdir -p $(2); \
> >+ cp $@ $(2) ; \
> >+ $(mod_strip_cmd) $(2)/$(notdir $@)
> >+
> >+quiet_cmd_modules_compress_gzip = COMPRESS $@
> >+ cmd_modules_compress_gzip = gzip $(MODCOMPOPT) -c \
> >+ $(2)/`basename $@` \
> >+ > $(2)/`basename $@`.gz; \
> >+ rm $(2)/`basename $@`
>
> That is *three* extra shell invocations you got there
> for something make can compute itself using $(@F) iirc.

Ahhh. Didn't know that. Thanks. :)

Steve

Full patch (with modifications) follows...

================================
Signed-off-by: Steve Brokenshire <sbrokenshire@xestia.co.uk>

--- a/scripts/Makefile.modinst 2009-01-18 18:45:37.000000000 +0000
+++ b/scripts/Makefile.modinst 2009-01-25 18:39:50.000000000 +0000
@@ -5,6 +5,7 @@
PHONY := __modinst
__modinst:

+include include/config/auto.conf
include scripts/Kbuild.include

#
@@ -16,8 +17,21 @@ PHONY += $(modules)
__modinst: $(modules)
@:

-quiet_cmd_modules_install = INSTALL $@
- cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@)
+ifeq ($(CONFIG_MODULE_COMPRESS_OPTIONS), "")
+else
+ MODCOMPOPT = $(shell echo -n $(CONFIG_MODULE_COMPRESS_OPTIONS))
+endif
+
+quiet_cmd_modules_install = INSTALL $@
+ cmd_modules_install = mkdir -p $(2); \
+ cp $@ $(2) ; \
+ $(mod_strip_cmd) $(2)/$(notdir $@)
+
+quiet_cmd_modules_compress_gzip = COMPRESS $@
+ cmd_modules_compress_gzip = gzip $(MODCOMPOPT) -c \
+ $(2)/$(@F) \
+ > $(2)/$(@F).gz; \
+ rm $(2)/$(@F)

# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
@@ -26,8 +40,11 @@ ext-mod-dir = $(INSTALL_MOD_DIR)$(subst
modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D))

$(modules):
+
$(call cmd,modules_install,$(MODLIB)/$(modinst_dir))

+ $(if $(CONFIG_MODULE_COMPRESS_GZIP), \
+ $(call cmd,modules_compress_gzip,$(MODLIB)/$(modinst_dir)))

# Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable se we can use it in if_changed and friends.
--- a/init/Kconfig 2009-01-18 18:45:37.000000000 +0000
+++ b/init/Kconfig 2009-01-25 16:07:47.000000000 +0000
@@ -887,6 +887,62 @@ config MODULE_FORCE_UNLOAD
rmmod). This is mainly for kernel developers and desperate users.
If unsure, say N.

+config MODULE_COMPRESS
+ bool "Compress kernel modules on installation"
+ depends on MODULES
+ help
+ This option compresses the kernel modules when 'make
+ modules_install' is run.
+
+ The modules will be compressed into the selected compression
+ format with gzip being the default compression format.
+
+ 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.
+
+ When running mkinitrd you will find that an error message
+ appears saying that it cannot find a certain kernel module.
+ As a workaround, unset CONFIG_MODULE_COMPRESS, build the modules
+ and install them, run mkinitrd and create the initrd image, place
+ the initrd image in the correct place for booting, set
+ CONFIG_MODULE_COMPRESS and then install the modules again.
+
+ This option requires the module-init-tools package to be
+ configured with --enable-zlib (if using gzip which is the
+ default compression format).
+
+ If unsure, say N.
+
+config MODULE_COMPRESS_OPTIONS
+ string "Compression format command line options"
+ depends on MODULE_COMPRESS
+ help
+ This option specifies the command line options to be used for
+ the selected compression format.
+
+ Please refer to the selected compression format's documentation
+ on which options should be used.
+
+ If unsure, leave this option blank.
+
+choice
+ prompt "Kernel module compression format"
+ depends on MODULE_COMPRESS
+ default MODULE_COMPRESS_GZIP
+
+config MODULE_COMPRESS_GZIP
+ bool "gzip compression"
+ help
+ Compresses the kernel modules using the gzip (GNU zip)
+ compression format.
+
+ This option requires gzip to be installed.
+
+ If unsure, leave this option selected.
+
+endchoice
+
config MODVERSIONS
bool "Module versioning support"
help
--- a/Documentation/kbuild/modules.txt 2009-01-18 18:45:37.000000000 +0000
+++ b/Documentation/kbuild/modules.txt 2009-01-25 16:07:47.000000000 +0000
@@ -96,6 +96,13 @@ when building an external module.
Installation default is in /lib/modules/<kernel-version>/extra,
but may be prefixed with INSTALL_MOD_PATH - see separate
chapter.
+ If MODULES_COMPRESS is set when the modules_install target is
+ run then the module is compressed after it has been
+ copied to /lib/modules/<kernel-version>. Compressed modules
+ using the default gzip compression format will require
+ module-init-tools installed with --zlib-enabled.
+ Any options set in MODULE_COMPRESS_OPTIONS will be
+ passed to the selected compression format.

make -C $KDIR M=`pwd` clean
Remove all generated files for the module - the kernel