mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	- Add support for a zstd compressed initramfs. - Add compression for compressing built-in initramfs with zstd. I have tested this patch by boot testing with buildroot and QEMU. Specifically, I booted the kernel with both a zstd and gzip compressed initramfs, both built into the kernel and separate. I ensured that the correct compression algorithm was used. I tested on arm, aarch64, i386, and x86_64. This patch has been tested in production on aarch64 and x86_64 devices. Additionally, I have performance measurements from internal use in production. On an aarch64 device we saw 19 second boot time improvement from switching from lzma to zstd (27 seconds to 8 seconds). On an x86_64 device we saw a 9 second boot time reduction from switching from xz to zstd. Signed-off-by: Nick Terrell <terrelln@fb.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Tested-by: Sedat Dilek <sedat.dilek@gmail.com> Reviewed-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20200730190841.2071656-5-nickrterrell@gmail.com
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
# SPDX-License-Identifier: GPL-2.0
 | 
						|
#
 | 
						|
# kbuild file for usr/ - including initramfs image
 | 
						|
#
 | 
						|
 | 
						|
# cmd_bzip2, cmd_lzma, cmd_lzo, cmd_lz4 from scripts/Makefile.lib appends the
 | 
						|
# size at the end of the compressed file, which unfortunately does not work
 | 
						|
# with unpack_to_rootfs(). Make size_append no-op.
 | 
						|
override size_append := :
 | 
						|
 | 
						|
compress-y					:= shipped
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_GZIP)	:= gzip
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_BZIP2)	:= bzip2
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_LZMA)	:= lzma
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_XZ)	:= xzmisc
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_LZO)	:= lzo
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_LZ4)	:= lz4
 | 
						|
compress-$(CONFIG_INITRAMFS_COMPRESSION_ZSTD)	:= zstd
 | 
						|
 | 
						|
obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data.o
 | 
						|
 | 
						|
$(obj)/initramfs_data.o: $(obj)/initramfs_inc_data
 | 
						|
 | 
						|
ramfs-input := $(strip $(shell echo $(CONFIG_INITRAMFS_SOURCE)))
 | 
						|
cpio-data :=
 | 
						|
 | 
						|
# If CONFIG_INITRAMFS_SOURCE is empty, generate a small initramfs with the
 | 
						|
# default contents.
 | 
						|
ifeq ($(ramfs-input),)
 | 
						|
ramfs-input := $(srctree)/$(src)/default_cpio_list
 | 
						|
endif
 | 
						|
 | 
						|
ifeq ($(words $(ramfs-input)),1)
 | 
						|
 | 
						|
# If CONFIG_INITRAMFS_SOURCE specifies a single file, and it is suffixed with
 | 
						|
# .cpio, use it directly as an initramfs.
 | 
						|
ifneq ($(filter %.cpio,$(ramfs-input)),)
 | 
						|
cpio-data := $(ramfs-input)
 | 
						|
endif
 | 
						|
 | 
						|
# If CONFIG_INITRAMFS_SOURCE specifies a single file, and it is suffixed with
 | 
						|
# .cpio.*, use it directly as an initramfs, and avoid double compression.
 | 
						|
ifeq ($(words $(subst .cpio.,$(space),$(ramfs-input))),2)
 | 
						|
cpio-data := $(ramfs-input)
 | 
						|
compress-y := shipped
 | 
						|
endif
 | 
						|
 | 
						|
endif
 | 
						|
 | 
						|
# For other cases, generate the initramfs cpio archive based on the contents
 | 
						|
# specified by CONFIG_INITRAMFS_SOURCE.
 | 
						|
ifeq ($(cpio-data),)
 | 
						|
 | 
						|
cpio-data := $(obj)/initramfs_data.cpio
 | 
						|
 | 
						|
hostprogs := gen_init_cpio
 | 
						|
 | 
						|
# .initramfs_data.cpio.d is used to identify all files included
 | 
						|
# in initramfs and to detect if any files are added/removed.
 | 
						|
# Removed files are identified by directory timestamp being updated
 | 
						|
# The dependency list is generated by gen_initramfs.sh -l
 | 
						|
-include $(obj)/.initramfs_data.cpio.d
 | 
						|
 | 
						|
# do not try to update files included in initramfs
 | 
						|
$(deps_initramfs): ;
 | 
						|
 | 
						|
quiet_cmd_initfs = GEN     $@
 | 
						|
      cmd_initfs = \
 | 
						|
	$(CONFIG_SHELL) $< -o $@ -l $(obj)/.initramfs_data.cpio.d \
 | 
						|
	$(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \
 | 
						|
	$(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) \
 | 
						|
	$(ramfs-input)
 | 
						|
 | 
						|
# We rebuild initramfs_data.cpio if:
 | 
						|
# 1) Any included file is newer than initramfs_data.cpio
 | 
						|
# 2) There are changes in which files are included (added or deleted)
 | 
						|
# 3) If gen_init_cpio are newer than initramfs_data.cpio
 | 
						|
# 4) Arguments to gen_initramfs.sh changes
 | 
						|
$(obj)/initramfs_data.cpio: $(src)/gen_initramfs.sh $(obj)/gen_init_cpio $(deps_initramfs) FORCE
 | 
						|
	$(call if_changed,initfs)
 | 
						|
 | 
						|
endif
 | 
						|
 | 
						|
$(obj)/initramfs_inc_data: $(cpio-data) FORCE
 | 
						|
	$(call if_changed,$(compress-y))
 | 
						|
 | 
						|
targets += initramfs_data.cpio initramfs_inc_data
 | 
						|
 | 
						|
subdir-$(CONFIG_UAPI_HEADER_TEST) += include
 |