Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp80946ybg; Mon, 27 Jul 2020 16:14:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzh2pW8K0wDsfWSeclPxrikrdULFsOKWNP8ZZN9vHCjVSWEowhqy9mDvK1+HY16av7UlhHQ X-Received: by 2002:a05:6402:1841:: with SMTP id v1mr23602858edy.198.1595891692063; Mon, 27 Jul 2020 16:14:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595891692; cv=none; d=google.com; s=arc-20160816; b=No7MVBZpCvH2aCrkoDXy56+HMU+dR2bv4jxH8kKtSxHkJkS6utiQcqfDNd1e9D5Dpa R4SkvtROanHU8cwBPM/9iWL5BFTXg0yCe4Z6k1tXmZIZIM7xRDvr66dczPvWSJ8O5nu4 8f67k69IoesD9RRCRtdozE5Y+OYO24vgwE8iV2PiJo4LJGWEpWpcX5JuXUiQIAMeuFYS CKmD/CI68JXbwEobZjMAO9F3An6pGDdhIwMUZ933/WxB2HNUgeJ7nKbfSSR65MG85UvK LDdCUbcjg2tKJRlg/0/GfxoC1JUdfCHuzCrFuFdbApgaM4DPpdxFOxX/CVtmLCIzvfzk GMOw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=qm76wASs3D6ofcAH/PnfzfxxKPehOLXTFuxjNCCLncM=; b=SHYy0uM80COxtvjUrEOQSoRKoIKn94RdH3RUtzJkkMbdHQQD0V1sszRTSfezd4UuQr ZnWr1d4cBhNnQep5YIJnhFoXLQR65+MnlNQKGIgKrGbmf67J5vBpToK/8GBdIEz33hJM 5nH5U8VRDRoAjlY3RV3cascCvs5suFN9LwRUyrFh5lA9SKEhqukvfxK3xNANqAefGGQq FgTRS62uty+uEJ/DJGbcru5Pb44Nlk3CBrSvogQnxEN0+APbjvCQniR3dR7QzZs7rtZ3 Ztkf9Cy+2XqMzHOk9WuuapnpFsPhS83lvlXXuondcFYms/3e4xiLznBfY0d5DzZMhaZZ v5dA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QGV1tFoF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m2si5033627ejj.244.2020.07.27.16.14.29; Mon, 27 Jul 2020 16:14:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QGV1tFoF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727990AbgG0XLQ (ORCPT + 99 others); Mon, 27 Jul 2020 19:11:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35012 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726183AbgG0XLO (ORCPT ); Mon, 27 Jul 2020 19:11:14 -0400 Received: from mail-pg1-x544.google.com (mail-pg1-x544.google.com [IPv6:2607:f8b0:4864:20::544]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5256C061794; Mon, 27 Jul 2020 16:11:13 -0700 (PDT) Received: by mail-pg1-x544.google.com with SMTP id m22so10807380pgv.9; Mon, 27 Jul 2020 16:11:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qm76wASs3D6ofcAH/PnfzfxxKPehOLXTFuxjNCCLncM=; b=QGV1tFoF+y72yqXUeCjI5AgbZfq67hn1DUaVr2mUAasGnleJlFCg4RWZYkjgVi3gMY 1AA4bARcYMDgFC5JIAw1u9AbRmZFcwTk8vomYNrL3KuDCufBIGkSHbPqHvw3mis8O87R bgjYKejO/Abb73tDJ/r1KGSZnbhhtyH9ZnKhDNWEyYFWNmfnFOTS18ivuK4PPEMhkHJh 68T3efy5Hmb+uqruBAP6rw7v3TY5uMnLp/f2Mxqnjcvy0y1zZe2A5iEv0JKve9NxB1aj BZDRFgh5/UNclbsIVOrJtd3im67EeIRrKq1ulB7RL6PEqAwPJDPRmABa9ECRBtctUbcj aafw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qm76wASs3D6ofcAH/PnfzfxxKPehOLXTFuxjNCCLncM=; b=gW3Eib7UHqMu0Z1Tsw8qb+foj0eK5TQCPew2f6pQVzTHFwoCzvzd0gBiADQUrjXkhy gGE3PuplGQ0mnvp/g4LYlfBe8J0lpZ7q4SpJW4gW4s27SDQjX8UpyOHZXXUwSta50mNt 4+AkTSINWXDzu6T1v41JYVg9Fk1U9yx7H26+PGiS5cUEfbORGUi1pRSKZBiQIcJpt2if tpJT1IX42lYVSL4Fs7krCBTgGGWpvj30LGiM+4rEPdiqA5Tl5SX/H9LK1lamFdz+HR7N v8TEaBPF6TyUmBs6irACjmBwlyLqgf7J0kVxFLiXOguxbA09Pf9vqcqoPXXcphGhyogV U1Tg== X-Gm-Message-State: AOAM530pH/8kvn8J6GGAKfwfqZcm+P3nap4o22aCRd6p5R3CFNfzZKxg gV4lQddGC2J9wnOA8ByAHEo= X-Received: by 2002:aa7:8f07:: with SMTP id x7mr6674193pfr.2.1595891473246; Mon, 27 Jul 2020 16:11:13 -0700 (PDT) Received: from nickserv.localdomain (c-98-33-101-203.hsd1.ca.comcast.net. [98.33.101.203]) by smtp.gmail.com with ESMTPSA id y68sm3515931pfy.185.2020.07.27.16.11.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jul 2020 16:11:12 -0700 (PDT) From: Nick Terrell To: Borislav Petkov , Thomas Gleixner Cc: linux-kernel@vger.kernel.org, Chris Mason , linux-kbuild@vger.kernel.org, x86@kernel.org, gregkh@linuxfoundation.org, Petr Malat , Kees Cook , Kernel Team , Nick Terrell , Adam Borowski , Patrick Williams , rmikey@fb.com, mingo@kernel.org, Patrick Williams , Sedat Dilek , Norbert Lange , Andrew Morton , Alex Xu , Arvind Sankar , Nick Terrell Subject: [PATCH v9 6/7] x86: Add support for ZSTD compressed kernel Date: Mon, 27 Jul 2020 16:06:05 -0700 Message-Id: <20200727230606.906598-7-nickrterrell@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200727230606.906598-1-nickrterrell@gmail.com> References: <20200727230606.906598-1-nickrterrell@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nick Terrell * Add support for zstd compressed kernel * Define __DISABLE_EXPORTS in misc.c * Bump the heap size for zstd. * Update the documentation. Integrates the ZSTD decompression code to the x86 pre-boot code. Zstandard requires slightly more memory during the kernel decompression on x86 (192 KB vs 64 KB), and the memory usage is independent of the window size. __DISABLE_EXPORTS is defined in misc.c instead of the Makefile because kaslr.c defines __DISABLE_EXPORTS, and defining it in the Makefile gives duplicate definition warnings. This patch has been boot tested with both a zstd and gzip compressed kernel on i386 and x86_64 using buildroot and QEMU. Additionally, this has been tested in production on x86_64 devices. We saw a 2 second boot time reduction by switching kernel compression from xz to zstd. Reviewed-by: Kees Cook Tested-by: Sedat Dilek Signed-off-by: Nick Terrell --- Documentation/x86/boot.rst | 6 +++--- arch/x86/Kconfig | 1 + arch/x86/boot/compressed/Makefile | 6 +++++- arch/x86/boot/compressed/kaslr.c | 7 ------- arch/x86/boot/compressed/misc.c | 4 ++++ arch/x86/include/asm/boot.h | 11 +++++++++-- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Documentation/x86/boot.rst b/Documentation/x86/boot.rst index 5325c71ca877..7fafc7ac00d7 100644 --- a/Documentation/x86/boot.rst +++ b/Documentation/x86/boot.rst @@ -782,9 +782,9 @@ Protocol: 2.08+ uncompressed data should be determined using the standard magic numbers. The currently supported compression formats are gzip (magic numbers 1F 8B or 1F 9E), bzip2 (magic number 42 5A), LZMA - (magic number 5D 00), XZ (magic number FD 37), and LZ4 (magic number - 02 21). The uncompressed payload is currently always ELF (magic - number 7F 45 4C 46). + (magic number 5D 00), XZ (magic number FD 37), LZ4 (magic number + 02 21) and ZSTD (magic number 28 B5). The uncompressed payload is + currently always ELF (magic number 7F 45 4C 46). ============ ============== Field name: payload_length diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 883da0abf779..4a64395bc35d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -188,6 +188,7 @@ config X86 select HAVE_KERNEL_LZMA select HAVE_KERNEL_LZO select HAVE_KERNEL_XZ + select HAVE_KERNEL_ZSTD select HAVE_KPROBES select HAVE_KPROBES_ON_FTRACE select HAVE_FUNCTION_ERROR_INJECTION diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index 5a828fde7a42..c08714ae76ec 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile @@ -26,7 +26,7 @@ OBJECT_FILES_NON_STANDARD := y KCOV_INSTRUMENT := n targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \ - vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4 + vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4 vmlinux.bin.zst KBUILD_CFLAGS := -m$(BITS) -O2 KBUILD_CFLAGS += -fno-strict-aliasing $(call cc-option, -fPIE, -fPIC) @@ -42,6 +42,7 @@ KBUILD_CFLAGS += $(call cc-disable-warning, gnu) KBUILD_CFLAGS += -Wno-pointer-sign KBUILD_CFLAGS += $(call cc-option,-fmacro-prefix-map=$(srctree)/=) KBUILD_CFLAGS += -fno-asynchronous-unwind-tables +KBUILD_CFLAGS += -D__DISABLE_EXPORTS KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ GCOV_PROFILE := n @@ -145,6 +146,8 @@ $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE $(call if_changed,lzo) $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE $(call if_changed,lz4) +$(obj)/vmlinux.bin.zst: $(vmlinux.bin.all-y) FORCE + $(call if_changed,zstd22) suffix-$(CONFIG_KERNEL_GZIP) := gz suffix-$(CONFIG_KERNEL_BZIP2) := bz2 @@ -152,6 +155,7 @@ suffix-$(CONFIG_KERNEL_LZMA) := lzma suffix-$(CONFIG_KERNEL_XZ) := xz suffix-$(CONFIG_KERNEL_LZO) := lzo suffix-$(CONFIG_KERNEL_LZ4) := lz4 +suffix-$(CONFIG_KERNEL_ZSTD) := zst quiet_cmd_mkpiggy = MKPIGGY $@ cmd_mkpiggy = $(obj)/mkpiggy $< > $@ diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c index d7408af55738..0048269180d5 100644 --- a/arch/x86/boot/compressed/kaslr.c +++ b/arch/x86/boot/compressed/kaslr.c @@ -19,13 +19,6 @@ */ #define BOOT_CTYPE_H -/* - * _ctype[] in lib/ctype.c is needed by isspace() of linux/ctype.h. - * While both lib/ctype.c and lib/cmdline.c will bring EXPORT_SYMBOL - * which is meaningless and will cause compiling error in some cases. - */ -#define __DISABLE_EXPORTS - #include "misc.h" #include "error.h" #include "../string.h" diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 9652d5c2afda..39e592d0e0b4 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -77,6 +77,10 @@ static int lines, cols; #ifdef CONFIG_KERNEL_LZ4 #include "../../../../lib/decompress_unlz4.c" #endif + +#ifdef CONFIG_KERNEL_ZSTD +#include "../../../../lib/decompress_unzstd.c" +#endif /* * NOTE: When adding a new decompressor, please update the analysis in * ../header.S. diff --git a/arch/x86/include/asm/boot.h b/arch/x86/include/asm/boot.h index 680c320363db..9191280d9ea3 100644 --- a/arch/x86/include/asm/boot.h +++ b/arch/x86/include/asm/boot.h @@ -24,9 +24,16 @@ # error "Invalid value for CONFIG_PHYSICAL_ALIGN" #endif -#ifdef CONFIG_KERNEL_BZIP2 +#if defined(CONFIG_KERNEL_BZIP2) # define BOOT_HEAP_SIZE 0x400000 -#else /* !CONFIG_KERNEL_BZIP2 */ +#elif defined(CONFIG_KERNEL_ZSTD) +/* + * Zstd needs to allocate the ZSTD_DCtx in order to decompress the kernel. + * The ZSTD_DCtx is ~160KB, so set the heap size to 192KB because it is a + * round number and to allow some slack. + */ +# define BOOT_HEAP_SIZE 0x30000 +#else # define BOOT_HEAP_SIZE 0x10000 #endif -- 2.27.0