From patchwork Fri Apr 11 05:37:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Changyuan Lyu X-Patchwork-Id: 14047567 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4FDF3C36010 for ; Fri, 11 Apr 2025 05:38:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D586D28015F; Fri, 11 Apr 2025 01:38:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE38F28015B; Fri, 11 Apr 2025 01:38:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B092228015F; Fri, 11 Apr 2025 01:38:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 887B228015B for ; Fri, 11 Apr 2025 01:38:33 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 64039121DD9 for ; Fri, 11 Apr 2025 05:38:34 +0000 (UTC) X-FDA: 83320658148.08.D076DCC Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by imf29.hostedemail.com (Postfix) with ESMTP id 95CC0120005 for ; Fri, 11 Apr 2025 05:38:32 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=iPzGkkG8; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf29.hostedemail.com: domain of 316r4ZwoKCFY05yB4MIyB94CC492.0CA96BIL-AA8Jy08.CF4@flex--changyuanl.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=316r4ZwoKCFY05yB4MIyB94CC492.0CA96BIL-AA8Jy08.CF4@flex--changyuanl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744349912; a=rsa-sha256; cv=none; b=OiIB561HTRrOuyGCaOXgwFbLvrJRccJh8Vi1rjVUHJgBGAE9nQri/4737JavUKS0OwAnBr c7FvMaoNFrPLIzoIpUCy75hLL9L0pxmjUgnmQpkLTuHi015RkK3EZl2YZlqEhC5qxtSRdw odGfxFB1BhMhXBnYE4IyMVacGyqQWyE= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=iPzGkkG8; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf29.hostedemail.com: domain of 316r4ZwoKCFY05yB4MIyB94CC492.0CA96BIL-AA8Jy08.CF4@flex--changyuanl.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=316r4ZwoKCFY05yB4MIyB94CC492.0CA96BIL-AA8Jy08.CF4@flex--changyuanl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744349912; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=NQ4ycF7gsLT06FnekoMeMnv8oicyD3TdT/CesWgek8A=; b=nKrynTaA7Fmut7Bh7qjZRZhjwh/hMxcZZFFNeujIXDq+XKk/dGwC0VA7pVEQ30CXICintI 8h3uK4zAR0HGvrMEqg8tGomjT6uZb3TyM7ze4rB/XbgG2G7TlBYunOJjQoUw8BZXhJcQEa 6pCt9bKqNn1rJbhpoGjCMRxz2EmxPGM= Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-af5310c1ac1so1094909a12.2 for ; Thu, 10 Apr 2025 22:38:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744349911; x=1744954711; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=NQ4ycF7gsLT06FnekoMeMnv8oicyD3TdT/CesWgek8A=; b=iPzGkkG8Zk+6XXHIvVK9Y1JtWF/jQVWxrTheCC8Yr/xlZrCRITFhMXJoBZxkCSuNtP A793aaRne1Yi0dt4B2xOBI9Jd+Es+r9UVHcMELL9kgvS+SKBDVpOGy8AOlRjQBtlYA3q oP7vuxx8Vn5eoKiM7Rkh/XMyPVQ4W5Bg00z/trhfeq1p4DhCp5bbCy38aaxZQXmVI/aR 4WSTJpACE0d6RAkq1WFYa9qHFl4SGdvGw1VYbWeTFO7SuZAztvgXKrcF6Cj7gkIld7zT kQ8oROrUm6AN8OEkVF5ar3iyh3cB4kev3tRrFf18XmijJNV/fIwwFStQlqsT3ckvY4Zc hmrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744349911; x=1744954711; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NQ4ycF7gsLT06FnekoMeMnv8oicyD3TdT/CesWgek8A=; b=wfnWJlvaZIY6NNcoimnK8Wg8ZA56luDiu4KqZTsAFejXPxnAqvD9M/ckTBHgLbfG3k W7w7QUNyggn/FlHlqt4ioY0y8MIKQXSEG01qwJ4BIEn1gRuWtlbWdX14NCimu74iXJ7l Hh/R93R50aqPj/MqdK6ZRBNocMaxUWRASYnFfncktzvpLfgOFEorckctwcnR5VbTeY54 ifeQpMPJy89voDOVvvwOUZZo2oN/FvS/EyRU00BW5s/LemffMvEoNoCkgqXtXwRDCOhh NjnKwRXbmaovfr0VcacCuZpE6f/8QQW/FWvqs103T1ZTfoOK4DMXj7WzBh0iI2ajbW5L 1e1g== X-Forwarded-Encrypted: i=1; AJvYcCWpisfGx1RekMBN3XERE871z0iZpitY3Y0UG8Baaj58g6t59oKqQF3s6EUqBXXw3NJfcZwMwQI+1g==@kvack.org X-Gm-Message-State: AOJu0YxJ+SZ1S/MHYvL3Q0/FydPclYL0wBe0weE4XHUEMlkRmVPWLz8K 2kVKX+5jjtxsccC96pdwdszQCVj0V/+UM3Vb9OUxlUrqL72pbiyJapIkGHJGECCp3O+bGQkXCjO 4k/3FpYrjhfg2aOdiIg== X-Google-Smtp-Source: AGHT+IFmHMamHSCxGJ9jONFAPmV1A91iPoS28bApZs3vQoT8HryanIff8vx754Cryl7fBwGV08e16HC+nkdncy1g X-Received: from plcc1.prod.google.com ([2002:a17:902:c1c1:b0:220:da6b:5d08]) (user=changyuanl job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f705:b0:220:e9ac:e746 with SMTP id d9443c01a7336-22bea4fdc7amr25793305ad.53.1744349911576; Thu, 10 Apr 2025 22:38:31 -0700 (PDT) Date: Thu, 10 Apr 2025 22:37:38 -0700 In-Reply-To: <20250411053745.1817356-1-changyuanl@google.com> Mime-Version: 1.0 References: <20250411053745.1817356-1-changyuanl@google.com> X-Mailer: git-send-email 2.49.0.604.gff1f9ca942-goog Message-ID: <20250411053745.1817356-8-changyuanl@google.com> Subject: [PATCH v6 07/14] kexec: add KHO support to kexec file loads From: Changyuan Lyu To: linux-kernel@vger.kernel.org Cc: akpm@linux-foundation.org, anthony.yznaga@oracle.com, arnd@arndb.de, ashish.kalra@amd.com, benh@kernel.crashing.org, bp@alien8.de, catalin.marinas@arm.com, corbet@lwn.net, dave.hansen@linux.intel.com, devicetree@vger.kernel.org, dwmw2@infradead.org, ebiederm@xmission.com, graf@amazon.com, hpa@zytor.com, jgowans@amazon.com, kexec@lists.infradead.org, krzk@kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, luto@kernel.org, mark.rutland@arm.com, mingo@redhat.com, pasha.tatashin@soleen.com, pbonzini@redhat.com, peterz@infradead.org, ptyadav@amazon.de, robh@kernel.org, rostedt@goodmis.org, rppt@kernel.org, saravanak@google.com, skinsburskii@linux.microsoft.com, tglx@linutronix.de, thomas.lendacky@amd.com, will@kernel.org, x86@kernel.org, Changyuan Lyu X-Rspam-User: X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 95CC0120005 X-Stat-Signature: afwtws4jmyffi694rc85nehz8qpy4ber X-HE-Tag: 1744349912-484689 X-HE-Meta: U2FsdGVkX1+RXbwvDZO1+Fu0qd1tvmIDRwADzfzNI0JSq/YJCV3+PBdwg7OL26ZAEJuyqaahCgdtAhe09X1ylAEPqCd+tCf0zfa4Vthc5aK5suGpopHdHj65rqkiv5arqcbihcJuPqXekIRwLpvxkNeRVayI+dZBXiqs/DrTUUAFnmNga6nrgWSgmg20C+FCLeNH4YFsoE0d/IJsz4JYRp7sU0dXC6EX2grmi/zpaOCCou0hRhPc4G/JSJzBWswO4dBkVknVMU4+XLIkmyZP7R4rbXFu2jYriIX6tDgSNmsCi87yFtgC+KnyFEuWpup36HRyCwt1jrCQ1G5Q6pQ0FsvUl0XHpACYeo3r28vbnK8EuGC3pJSXOnC1or5AWeUCmi6Nv7i+PCJSwMQL+cK8/mtW4d05a5DGj313tkncxvAXLpI+9uB0VCIsLOtZOHHAFV3b+nD+hpMHXfGYlKmizDt5tLChJNF7hNHbHY+XVCcwrrrtcy9KeBUu+fCpu0SQKJJwKwjDQNsdugRm0QDkSsz0fptJzYYmaH9iCqQ9IAtq9qQiKMC6s75xWX/xcElWBTRUt/sdln4WrAiv4cFrY/spNeyY4PLlV9WX6b/oF+weDesvp0IWrDuxHIqvD7tnxoldHNAn+gyzQpKv2GVsj/ukuNceQkEcbgc7SmocCsxquvaSOK8HaS0hD5p4aaotIrUNSe+sSt0i976Ht6vZGWpJtLSmLSnewBEzkPJOWOhsYXqz5T5vfsA2sqPRn7MbLpD17e1bazBJK1owxMVnxD50SD8pOCjqkcGcYn5DyYPBXgGq9AJUBijFmS+A7ZZW0MNWL3vOz7d4qQjb4o5hpHkBlRVccWClkxL5TlQppU3FbTYqkmmCAznhPCscyf7jWPOsBi/A2tJsNt458CxPvsLs0Ke3hUWMrc2PzTq0Ft9m10Xi8wSR6s868wSkOVa8GYTF9s5fqIBBg8QlHAE DSfanj84 aK6T2/9freFmVlwupgGAqNJbSj90xDRAUXiSB3LLFsZNEo7yeScI+pZ9Gl8hrDjvM+MyHEC9MVrxwnHnKuWs99S77l04sunXS/EZXx4Pjh9IIZtgz0oleK5jR9dt32yKgZKgci8x9MWqmknhH+7oS2N/7x+T55Hw7zPe75ovY4WTKT+tHt8TDUMYu1LELykHgUH1s60TmANcQzVZXT5DwfILd1DxzaTCQumwtsbkvyF8IzVkmhvcJQy6FQOgBBm1uIa3O56upu7rWuT1opxjRykvb2X1JNXxLsYzYgbZKDPKh3EtzCBn1P5QoJSX+AgtQG/K3y2xM7m8ycMRDB2NkMdGdYrjVfuTjVk4gF5K0mT8wt9oZ6S5JdItvZeKZCM3j50tcQVuAQ5SFYMXQx7gUF6VYCq7o6/oZeMjT7sqwj3flC5toEDChGULp6BadibD78wLru3VrtOKHr9JIs+KK+4JwsleKw9zTxKaN3P2gnQCqHRIWhtThD+/6xiD1xBWAP+a8Oyg7rSoFyWOwntbwIAo5XS2/HIFPukAvym7Rlbi0pe5exqgunXEFXJLF52pIPlmnClBZ2D722kENnJQXeah0ztvkOVw7xTBRlVyFKG/5yEbQ9a/QUHAVXQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Alexander Graf Kexec has 2 modes: A user space driven mode and a kernel driven mode. For the kernel driven mode, kernel code determines the physical addresses of all target buffers that the payload gets copied into. With KHO, we can only safely copy payloads into the "scratch area". Teach the kexec file loader about it, so it only allocates for that area. In addition, enlighten it with support to ask the KHO subsystem for its respective payloads to copy into target memory. Also teach the KHO subsystem how to fill the images for file loads. Signed-off-by: Alexander Graf Co-developed-by: Mike Rapoport (Microsoft) Signed-off-by: Mike Rapoport (Microsoft) Co-developed-by: Changyuan Lyu Signed-off-by: Changyuan Lyu --- include/linux/kexec.h | 7 +++++ kernel/kexec_file.c | 13 ++++++++ kernel/kexec_handover.c | 67 +++++++++++++++++++++++++++++++++++++++++ kernel/kexec_internal.h | 16 ++++++++++ 4 files changed, 103 insertions(+) diff --git a/include/linux/kexec.h b/include/linux/kexec.h index c8971861521a5..d3cad108b8076 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -371,6 +371,13 @@ struct kimage { size_t ima_buffer_size; #endif +#ifdef CONFIG_KEXEC_HANDOVER + struct { + struct kexec_segment *scratch; + phys_addr_t fdt; + } kho; +#endif + /* Core ELF header buffer */ void *elf_headers; unsigned long elf_headers_sz; diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index fba686487e3b5..77758c5331229 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -253,6 +253,11 @@ kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int initrd_fd, /* IMA needs to pass the measurement list to the next kernel. */ ima_add_kexec_buffer(image); + /* If KHO is active, add its images to the list */ + ret = kho_fill_kimage(image); + if (ret) + goto out; + /* Call image load handler */ ldata = kexec_image_load_default(image); @@ -648,6 +653,14 @@ int kexec_locate_mem_hole(struct kexec_buf *kbuf) if (kbuf->mem != KEXEC_BUF_MEM_UNKNOWN) return 0; + /* + * If KHO is active, only use KHO scratch memory. All other memory + * could potentially be handed over. + */ + ret = kho_locate_mem_hole(kbuf, locate_mem_hole_callback); + if (ret <= 0) + return ret; + if (!IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) ret = kexec_walk_resources(kbuf, locate_mem_hole_callback); else diff --git a/kernel/kexec_handover.c b/kernel/kexec_handover.c index a594da2a22912..4bbc6f5ef7230 100644 --- a/kernel/kexec_handover.c +++ b/kernel/kexec_handover.c @@ -23,6 +23,7 @@ * internal APIs. */ #include "../mm/internal.h" +#include "kexec_internal.h" #define KHO_FDT_COMPATIBLE "kho-v1" #define PROP_PRESERVED_MEMORY_MAP "preserved-memory-map" @@ -1184,3 +1185,69 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len, if (err) pr_warn("disabling KHO revival: %d\n", err); } + +/* Helper functions for kexec_file_load */ + +int kho_fill_kimage(struct kimage *image) +{ + ssize_t scratch_size; + int err = 0; + struct kexec_buf scratch; + + if (!kho_enable) + return 0; + + image->kho.fdt = page_to_phys(kho_out.ser.fdt); + + scratch_size = sizeof(*kho_scratch) * kho_scratch_cnt; + scratch = (struct kexec_buf){ + .image = image, + .buffer = kho_scratch, + .bufsz = scratch_size, + .mem = KEXEC_BUF_MEM_UNKNOWN, + .memsz = scratch_size, + .buf_align = SZ_64K, /* Makes it easier to map */ + .buf_max = ULONG_MAX, + .top_down = true, + }; + err = kexec_add_buffer(&scratch); + if (err) + return err; + image->kho.scratch = &image->segment[image->nr_segments - 1]; + + return 0; +} + +static int kho_walk_scratch(struct kexec_buf *kbuf, + int (*func)(struct resource *, void *)) +{ + int ret = 0; + int i; + + for (i = 0; i < kho_scratch_cnt; i++) { + struct resource res = { + .start = kho_scratch[i].addr, + .end = kho_scratch[i].addr + kho_scratch[i].size - 1, + }; + + /* Try to fit the kimage into our KHO scratch region */ + ret = func(&res, kbuf); + if (ret) + break; + } + + return ret; +} + +int kho_locate_mem_hole(struct kexec_buf *kbuf, + int (*func)(struct resource *, void *)) +{ + int ret; + + if (!kho_enable || kbuf->image->type == KEXEC_TYPE_CRASH) + return 1; + + ret = kho_walk_scratch(kbuf, func); + + return ret == 1 ? 0 : -EADDRNOTAVAIL; +} diff --git a/kernel/kexec_internal.h b/kernel/kexec_internal.h index d35d9792402d1..30a733a55a67b 100644 --- a/kernel/kexec_internal.h +++ b/kernel/kexec_internal.h @@ -39,4 +39,20 @@ extern size_t kexec_purgatory_size; #else /* CONFIG_KEXEC_FILE */ static inline void kimage_file_post_load_cleanup(struct kimage *image) { } #endif /* CONFIG_KEXEC_FILE */ + +struct kexec_buf; + +#ifdef CONFIG_KEXEC_HANDOVER +int kho_locate_mem_hole(struct kexec_buf *kbuf, + int (*func)(struct resource *, void *)); +int kho_fill_kimage(struct kimage *image); +#else +static inline int kho_locate_mem_hole(struct kexec_buf *kbuf, + int (*func)(struct resource *, void *)) +{ + return 1; +} + +static inline int kho_fill_kimage(struct kimage *image) { return 0; } +#endif /* CONFIG_KEXEC_HANDOVER */ #endif /* LINUX_KEXEC_INTERNAL_H */