forked from rubenslte/android_kernel_samsung_msm8226
Add support for LZ4 decompression in the Linux Kernel. LZ4 Decompression
APIs for kernel are based on LZ4 implementation by Yann Collet.
Benchmark Results(PATCH v3)
Compiler: Linaro ARM gcc 4.6.2
1. ARMv7, 1.5GHz based board
Kernel: linux 3.4
Uncompressed Kernel Size: 14MB
Compressed Size Decompression Speed
LZO 6.7MB 20.1MB/s, 25.2MB/s(UA)
LZ4 7.3MB 29.1MB/s, 45.6MB/s(UA)
2. ARMv7, 1.7GHz based board
Kernel: linux 3.7
Uncompressed Kernel Size: 14MB
Compressed Size Decompression Speed
LZO 6.0MB 34.1MB/s, 52.2MB/s(UA)
LZ4 6.5MB 86.7MB/s
- UA: Unaligned memory Access support
- Latest patch set for LZO applied
This patch set is for adding support for LZ4-compressed Kernel. LZ4 is a
very fast lossless compression algorithm and it also features an extremely
fast decoder [1].
But we have five of decompressors already and one question which does
arise, however, is that of where do we stop adding new ones? This issue
had been discussed and came to the conclusion [2].
Russell King said that we should have:
- one decompressor which is the fastest
- one decompressor for the highest compression ratio
- one popular decompressor (eg conventional gzip)
If we have a replacement one for one of these, then it should do exactly
that: replace it.
The benchmark shows that an 8% increase in image size vs a 66% increase
in decompression speed compared to LZO(which has been known as the
fastest decompressor in the Kernel). Therefore the "fast but may not be
small" compression title has clearly been taken by LZ4 [3].
[1] http://code.google.com/p/lz4/
[2] http://thread.gmane.org/gmane.linux.kbuild.devel/9157
[3] http://thread.gmane.org/gmane.linux.kbuild.devel/9347
LZ4 homepage: http://fastcompression.blogspot.com/p/lz4.html
LZ4 source repository: http://code.google.com/p/lz4/
Signed-off-by: Kyungsik Lee <kyungsik.lee@lge.com>
Signed-off-by: Yann Collet <yann.collet.73@gmail.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Florian Fainelli <florian@openwrt.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib: add support for LZ4-compressed kernel
Add support for extracting LZ4-compressed kernel images, as well as
LZ4-compressed ramdisk images in the kernel boot process.
Signed-off-by: Kyungsik Lee <kyungsik.lee@lge.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Florian Fainelli <florian@openwrt.org>
Cc: Yann Collet <yann.collet.73@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib: add lz4 compressor module
This patchset is for supporting LZ4 compression and the crypto API using
it.
As shown below, the size of data is a little bit bigger but compressing
speed is faster under the enabled unaligned memory access. We can use
lz4 de/compression through crypto API as well. Also, It will be useful
for another potential user of lz4 compression.
lz4 Compression Benchmark:
Compiler: ARM gcc 4.6.4
ARMv7, 1 GHz based board
Kernel: linux 3.4
Uncompressed data Size: 101 MB
Compressed Size compression Speed
LZO 72.1MB 32.1MB/s, 33.0MB/s(UA)
LZ4 75.1MB 30.4MB/s, 35.9MB/s(UA)
LZ4HC 59.8MB 2.4MB/s, 2.5MB/s(UA)
- UA: Unaligned memory Access support
- Latest patch set for LZO applied
This patch:
Add support for LZ4 compression in the Linux Kernel. LZ4 Compression APIs
for kernel are based on LZ4 implementation by Yann Collet and were changed
for kernel coding style.
LZ4 homepage : http://fastcompression.blogspot.com/p/lz4.html
LZ4 source repository : http://code.google.com/p/lz4/
svn revision : r90
Two APIs are added:
lz4_compress() support basic lz4 compression whereas lz4hc_compress()
support high compression or CPU performance get lower but compression
ratio get higher. Also, we require the pre-allocated working memory with
the defined size and destination buffer must be allocated with the size of
lz4_compressbound.
[akpm@linux-foundation.org: make lz4_compresshcctx() static]
Signed-off-by: Chanho Min <chanho.min@lge.com>
Cc: "Darrick J. Wong" <djwong@us.ibm.com>
Cc: Bob Pearson <rpearson@systemfabricworks.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Herbert Xu <herbert@gondor.hengli.com.au>
Cc: Yann Collet <yann.collet.73@gmail.com>
Cc: Kyungsik Lee <kyungsik.lee@lge.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/lz4: correct the LZ4 license
The LZ4 code is listed as using the "BSD 2-Clause License".
Signed-off-by: Richard Laager <rlaager@wiktel.com>
Acked-by: Kyungsik Lee <kyungsik.lee@lge.com>
Cc: Chanho Min <chanho.min@lge.com>
Cc: Richard Yao <ryao@gentoo.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
[ The 2-clause BSD can be just converted into GPL, but that's rude and
pointless, so don't do it - Linus ]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lz4: fix compression/decompression signedness mismatch
LZ4 compression and decompression functions require different in
signedness input/output parameters: unsigned char for compression and
signed char for decompression.
Change decompression API to require "(const) unsigned char *".
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Kyungsik Lee <kyungsik.lee@lge.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Yann Collet <yann.collet.73@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lz4: ensure length does not wrap
Given some pathologically compressed data, lz4 could possibly decide to
wrap a few internal variables, causing unknown things to happen. Catch
this before the wrapping happens and abort the decompression.
Reported-by: "Don A. Bailey" <donb@securitymouse.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
lz4: fix another possible overrun
There is one other possible overrun in the lz4 code as implemented by
Linux at this point in time (which differs from the upstream lz4
codebase, but will get synced at in a future kernel release.) As
pointed out by Don, we also need to check the overflow in the data
itself.
While we are at it, replace the odd error return value with just a
"simple" -1 value as the return value is never used for anything other
than a basic "did this work or not" check.
Reported-by: "Don A. Bailey" <donb@securitymouse.com>
Reported-by: Willy Tarreau <w@1wt.eu>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
lz4: add overrun checks to lz4_uncompress_unknownoutputsize()
Jan points out that I forgot to make the needed fixes to the
lz4_uncompress_unknownoutputsize() function to mirror the changes done
in lz4_decompress() with regards to potential pointer overflows.
The only in-kernel user of this function is the zram code, which only
takes data from a valid compressed buffer that it made itself, so it's
not a big issue. But due to external kernel modules using this
function, it's better to be safe here.
Reported-by: Jan Beulich <JBeulich@suse.com>
Cc: "Don A. Bailey" <donb@securitymouse.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
LZ4 : fix the data abort issue
If the part of the compression data are corrupted, or the compression
data is totally fake, the memory access over the limit is possible.
This is the log from my system usning lz4 decompression.
[6502]data abort, halting
[6503]r0 0x00000000 r1 0x00000000 r2 0xdcea0ffc r3 0xdcea0ffc
[6509]r4 0xb9ab0bfd r5 0xdcea0ffc r6 0xdcea0ff8 r7 0xdce80000
[6515]r8 0x00000000 r9 0x00000000 r10 0x00000000 r11 0xb9a98000
[6522]r12 0xdcea1000 usp 0x00000000 ulr 0x00000000 pc 0x820149bc
[6528]spsr 0x400001f3
and the memory addresses of some variables at the moment are
ref:0xdcea0ffc, op:0xdcea0ffc, oend:0xdcea1000
As you can see, COPYLENGH is 8bytes, so @ref and @op can access the momory
over @oend.
Change-Id: I9919c9bcfca9ae9e26d83fa49afff99e74295d3b
Signed-off-by: JeHyeon Yeon <tom.yeon@windriver.com>
Reviewed-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kevin F. Haggerty <haggertk@lineageos.org>
178 lines
5.6 KiB
Plaintext
178 lines
5.6 KiB
Plaintext
#
|
|
# Configuration for initramfs
|
|
#
|
|
|
|
config INITRAMFS_SOURCE
|
|
string "Initramfs source file(s)"
|
|
default ""
|
|
help
|
|
This can be either a single cpio archive with a .cpio suffix or a
|
|
space-separated list of directories and files for building the
|
|
initramfs image. A cpio archive should contain a filesystem archive
|
|
to be used as an initramfs image. Directories should contain a
|
|
filesystem layout to be included in the initramfs image. Files
|
|
should contain entries according to the format described by the
|
|
"usr/gen_init_cpio" program in the kernel tree.
|
|
|
|
When multiple directories and files are specified then the
|
|
initramfs image will be the aggregate of all of them.
|
|
|
|
See <file:Documentation/early-userspace/README> for more details.
|
|
|
|
If you are not sure, leave it blank.
|
|
|
|
config INITRAMFS_ROOT_UID
|
|
int "User ID to map to 0 (user root)"
|
|
depends on INITRAMFS_SOURCE!=""
|
|
default "0"
|
|
help
|
|
This setting is only meaningful if the INITRAMFS_SOURCE is
|
|
contains a directory. Setting this user ID (UID) to something
|
|
other than "0" will cause all files owned by that UID to be
|
|
owned by user root in the initial ramdisk image.
|
|
|
|
If you are not sure, leave it set to "0".
|
|
|
|
config INITRAMFS_ROOT_GID
|
|
int "Group ID to map to 0 (group root)"
|
|
depends on INITRAMFS_SOURCE!=""
|
|
default "0"
|
|
help
|
|
This setting is only meaningful if the INITRAMFS_SOURCE is
|
|
contains a directory. Setting this group ID (GID) to something
|
|
other than "0" will cause all files owned by that GID to be
|
|
owned by group root in the initial ramdisk image.
|
|
|
|
If you are not sure, leave it set to "0".
|
|
|
|
config RD_GZIP
|
|
bool "Support initial ramdisks compressed using gzip" if EXPERT
|
|
default y
|
|
depends on BLK_DEV_INITRD
|
|
select DECOMPRESS_GZIP
|
|
help
|
|
Support loading of a gzip encoded initial ramdisk or cpio buffer.
|
|
If unsure, say Y.
|
|
|
|
config RD_BZIP2
|
|
bool "Support initial ramdisks compressed using bzip2" if EXPERT
|
|
default !EXPERT
|
|
depends on BLK_DEV_INITRD
|
|
select DECOMPRESS_BZIP2
|
|
help
|
|
Support loading of a bzip2 encoded initial ramdisk or cpio buffer
|
|
If unsure, say N.
|
|
|
|
config RD_LZMA
|
|
bool "Support initial ramdisks compressed using LZMA" if EXPERT
|
|
default !EXPERT
|
|
depends on BLK_DEV_INITRD
|
|
select DECOMPRESS_LZMA
|
|
help
|
|
Support loading of a LZMA encoded initial ramdisk or cpio buffer
|
|
If unsure, say N.
|
|
|
|
config RD_XZ
|
|
bool "Support initial ramdisks compressed using XZ" if EXPERT
|
|
default !EXPERT
|
|
depends on BLK_DEV_INITRD
|
|
select DECOMPRESS_XZ
|
|
help
|
|
Support loading of a XZ encoded initial ramdisk or cpio buffer.
|
|
If unsure, say N.
|
|
|
|
config RD_LZO
|
|
bool "Support initial ramdisks compressed using LZO" if EXPERT
|
|
default !EXPERT
|
|
depends on BLK_DEV_INITRD
|
|
select DECOMPRESS_LZO
|
|
help
|
|
Support loading of a LZO encoded initial ramdisk or cpio buffer
|
|
If unsure, say N.
|
|
|
|
config RD_LZ4
|
|
bool "Support initial ramdisks compressed using LZ4" if EXPERT
|
|
default !EXPERT
|
|
depends on BLK_DEV_INITRD
|
|
select DECOMPRESS_LZ4
|
|
help
|
|
Support loading of a LZ4 encoded initial ramdisk or cpio buffer
|
|
If unsure, say N.
|
|
|
|
choice
|
|
prompt "Built-in initramfs compression mode" if INITRAMFS_SOURCE!=""
|
|
help
|
|
This option decides by which algorithm the builtin initramfs
|
|
will be compressed. Several compression algorithms are
|
|
available, which differ in efficiency, compression and
|
|
decompression speed. Compression speed is only relevant
|
|
when building a kernel. Decompression speed is relevant at
|
|
each boot.
|
|
|
|
If you have any problems with bzip2 or LZMA compressed
|
|
initramfs, mail me (Alain Knaff) <alain@knaff.lu>.
|
|
|
|
High compression options are mostly useful for users who are
|
|
low on RAM, since it reduces the memory consumption during
|
|
boot.
|
|
|
|
If in doubt, select 'gzip'
|
|
|
|
config INITRAMFS_COMPRESSION_NONE
|
|
bool "None"
|
|
help
|
|
Do not compress the built-in initramfs at all. This may
|
|
sound wasteful in space, but, you should be aware that the
|
|
built-in initramfs will be compressed at a later stage
|
|
anyways along with the rest of the kernel, on those
|
|
architectures that support this.
|
|
However, not compressing the initramfs may lead to slightly
|
|
higher memory consumption during a short time at boot, while
|
|
both the cpio image and the unpacked filesystem image will
|
|
be present in memory simultaneously
|
|
|
|
config INITRAMFS_COMPRESSION_GZIP
|
|
bool "Gzip"
|
|
depends on RD_GZIP
|
|
help
|
|
The old and tried gzip compression. It provides a good balance
|
|
between compression ratio and decompression speed.
|
|
|
|
config INITRAMFS_COMPRESSION_BZIP2
|
|
bool "Bzip2"
|
|
depends on RD_BZIP2
|
|
help
|
|
Its compression ratio and speed is intermediate.
|
|
Decompression speed is slowest among the four. The initramfs
|
|
size is about 10% smaller with bzip2, in comparison to gzip.
|
|
Bzip2 uses a large amount of memory. For modern kernels you
|
|
will need at least 8MB RAM or more for booting.
|
|
|
|
config INITRAMFS_COMPRESSION_LZMA
|
|
bool "LZMA"
|
|
depends on RD_LZMA
|
|
help
|
|
The most recent compression algorithm.
|
|
Its ratio is best, decompression speed is between the other
|
|
three. Compression is slowest. The initramfs size is about 33%
|
|
smaller with LZMA in comparison to gzip.
|
|
|
|
config INITRAMFS_COMPRESSION_XZ
|
|
bool "XZ"
|
|
depends on RD_XZ
|
|
help
|
|
XZ uses the LZMA2 algorithm. The initramfs size is about 30%
|
|
smaller with XZ in comparison to gzip. Decompression speed
|
|
is better than that of bzip2 but worse than gzip and LZO.
|
|
Compression is slow.
|
|
|
|
config INITRAMFS_COMPRESSION_LZO
|
|
bool "LZO"
|
|
depends on RD_LZO
|
|
help
|
|
Its compression ratio is the poorest among the four. The kernel
|
|
size is about 10% bigger than gzip; however its speed
|
|
(both compression and decompression) is the fastest.
|
|
|
|
endchoice
|