Wouldn't it be better to fix gzip than hacking around this in the kernel? Andrew Boie <andrew.p.b...@intel.com> wrote: >Android OTA system computes very efficient diffs of compressed files >if the deflate() algorithm it has access to is the same version as >used to create the original file. Here we add support for compressing >the kernel with 'minigzip' which uses the deflate() inside zlib. >This is much better than using 'gzip' as that tool has a very old >version of deflate() inside the gzip codebase instead of linking >against >zlib. > >Signed-off-by: Andrew Boie <andrew.p.b...@intel.com> >--- > arch/x86/Kconfig | 1 + > arch/x86/boot/compressed/Makefile | 3 +++ > arch/x86/boot/compressed/misc.c | 2 +- > init/Kconfig | 18 +++++++++++++++++- > scripts/Makefile.lib | 7 +++++++ > 5 files changed, 29 insertions(+), 2 deletions(-) > >diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig >index f67e839..aa91cef 100644 >--- a/arch/x86/Kconfig >+++ b/arch/x86/Kconfig >@@ -62,6 +62,7 @@ config X86 > select HAVE_REGS_AND_STACK_ACCESS_API > select HAVE_DMA_API_DEBUG > select HAVE_KERNEL_GZIP >+ select HAVE_KERNEL_MINIGZIP > select HAVE_KERNEL_BZIP2 > select HAVE_KERNEL_LZMA > select HAVE_KERNEL_XZ >diff --git a/arch/x86/boot/compressed/Makefile >b/arch/x86/boot/compressed/Makefile >index dcd90df..f000791 100644 >--- a/arch/x86/boot/compressed/Makefile >+++ b/arch/x86/boot/compressed/Makefile >@@ -56,6 +56,8 @@ vmlinux.bin.all-$(CONFIG_X86_NEED_RELOCS) += >$(obj)/vmlinux.relocs > > $(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE > $(call if_changed,gzip) >+$(obj)/vmlinux.bin.mgz: $(vmlinux.bin.all-y) FORCE >+ $(call if_changed,minigzip) > $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE > $(call if_changed,bzip2) > $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE >@@ -68,6 +70,7 @@ $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE > $(call if_changed,lz4) > > suffix-$(CONFIG_KERNEL_GZIP) := gz >+suffix-$(CONFIG_KERNEL_MINIGZIP):= mgz > suffix-$(CONFIG_KERNEL_BZIP2) := bz2 > suffix-$(CONFIG_KERNEL_LZMA) := lzma > suffix-$(CONFIG_KERNEL_XZ) := xz >diff --git a/arch/x86/boot/compressed/misc.c >b/arch/x86/boot/compressed/misc.c >index 434f077..4e55d32 100644 >--- a/arch/x86/boot/compressed/misc.c >+++ b/arch/x86/boot/compressed/misc.c >@@ -125,7 +125,7 @@ static char *vidmem; > static int vidport; > static int lines, cols; > >-#ifdef CONFIG_KERNEL_GZIP >+#if defined(CONFIG_KERNEL_GZIP) || defined(CONFIG_KERNEL_MINIGZIP) > #include "../../../../lib/decompress_inflate.c" > #endif > >diff --git a/init/Kconfig b/init/Kconfig >index 3ecd8a1..818f225 100644 >--- a/init/Kconfig >+++ b/init/Kconfig >@@ -100,6 +100,9 @@ config LOCALVERSION_AUTO > config HAVE_KERNEL_GZIP > bool > >+config HAVE_KERNEL_MINIGZIP >+ bool >+ > config HAVE_KERNEL_BZIP2 > bool > >@@ -118,7 +121,7 @@ config HAVE_KERNEL_LZ4 > choice > prompt "Kernel compression mode" > default KERNEL_GZIP >- depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA >|| HAVE_KERNEL_XZ || HAVE_KERNEL_LZO || HAVE_KERNEL_LZ4 >+ depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_MINIGZIP || >HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_XZ || >HAVE_KERNEL_LZO || HAVE_KERNEL_LZ4 > help > The linux kernel is a kind of self-extracting executable. > Several compression algorithms are available, which differ >@@ -144,6 +147,19 @@ config KERNEL_GZIP > The old and tried gzip compression. It provides a good balance > between compression ratio and decompression speed. > >+config KERNEL_MINIGZIP >+ bool "Minigzip" >+ depends on HAVE_KERNEL_MINIGZIP >+ help >+ Use minigzip to compress the bzImage. This is very similar to gzip >+ but uses the zlib library to compress, rather than the very old >version >+ of zlib inside the gzip codebase. This is used for Android kernels >+ so that the same version of the deflate() algorithm is used when >+ building the kernel and constructing diffs with OTA applypatch, >which >+ uncompresses sections of files that it detects are gzipped before >computing >+ the diffs. If the versions of deflate() are out of alignment the >binary >+ diffs tend to be very large. >+ > config KERNEL_BZIP2 > bool "Bzip2" > depends on HAVE_KERNEL_BZIP2 >diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib >index 49392ec..deb1bb8 100644 >--- a/scripts/Makefile.lib >+++ b/scripts/Makefile.lib >@@ -240,6 +240,13 @@ quiet_cmd_gzip = GZIP $@ > cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \ > (rm -f $@ ; false) > >+# Minigzip >+# >--------------------------------------------------------------------------- >+ >+quiet_cmd_minigzip = MINGZIP $@ >+cmd_minigzip = (cat $(filter-out FORCE,$^) | minigzip -c -9 > $@) || \ >+ (rm -f $@ ; false) >+ > # DTC ># >--------------------------------------------------------------------------- >
-- Sent from my mobile phone. Please excuse brevity and lack of formatting. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/