From: Pingfan Liu <piliu@redhat.com>
To: kexec@lists.infradead.org
Cc: Pingfan Liu <piliu@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
John Fastabend <john.fastabend@gmail.com>,
Andrii Nakryiko <andrii@kernel.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
Jeremy Linton <jeremy.linton@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Ard Biesheuvel <ardb@kernel.org>,
Simon Horman <horms@kernel.org>,
Gerd Hoffmann <kraxel@redhat.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Philipp Rudo <prudo@redhat.com>, Viktor Malik <vmalik@redhat.com>,
Jan Hendrik Farr <kernel@jfarr.cc>, Baoquan He <bhe@redhat.com>,
Dave Young <dyoung@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
bpf@vger.kernel.org, systemd-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org
Subject: [PATCHv7 06/13] kexec_file: Chain the stages into a pipeline
Date: Sun, 22 Mar 2026 09:43:55 +0800 [thread overview]
Message-ID: <20260322014402.8815-7-piliu@redhat.com> (raw)
In-Reply-To: <20260322014402.8815-1-piliu@redhat.com>
Images may consist of multiple layers, each with a distinct format. For
example, an AArch64 UKI image typically embeds a zboot image in the
.linux section. The parser therefore determines whether its output
should be forwarded to the next stage.
Intermediate results are stored in next_parsing_buf and then promoted to
parsing_buf for the subsequent stage.
Signed-off-by: Pingfan Liu <piliu@redhat.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Philipp Rudo <prudo@redhat.com>
To: kexec@lists.infradead.org
---
kernel/kexec_bpf_loader.c | 47 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 46 insertions(+), 1 deletion(-)
diff --git a/kernel/kexec_bpf_loader.c b/kernel/kexec_bpf_loader.c
index af16f7b685d9a..7f7884411e2c7 100644
--- a/kernel/kexec_bpf_loader.c
+++ b/kernel/kexec_bpf_loader.c
@@ -41,6 +41,8 @@ struct kexec_context {
bool parsed;
char *parsing_buf[MAX_PARSING_BUF_NUM];
unsigned long parsing_buf_sz[MAX_PARSING_BUF_NUM];
+ char *next_parsing_buf[MAX_PARSING_BUF_NUM];
+ unsigned long next_parsing_buf_sz[MAX_PARSING_BUF_NUM];
char *kernel;
unsigned long kernel_sz;
@@ -278,8 +280,9 @@ static int kexec_buff_parser(struct bpf_parser_context *parser)
struct bpf_parser_buf *pbuf = parser->buf;
struct kexec_context *ctx = (struct kexec_context *)parser->data;
struct cmd_hdr *cmd = (struct cmd_hdr *)pbuf->buf;
- char *decompressed_buf, *buf, *p;
+ char *decompressed_buf, *buf, *p, *pn;
unsigned long decompressed_sz;
+ bool fill_pipeline = false;
int ret = 0;
buf = pbuf->buf + sizeof(struct cmd_hdr);
@@ -288,6 +291,7 @@ static int kexec_buff_parser(struct bpf_parser_context *parser)
cmd->payload_len, pbuf->size);
return -EINVAL;
}
+ fill_pipeline = cmd->pipeline_flag & KEXEC_BPF_PIPELINE_FILL;
switch (cmd->cmd) {
case KEXEC_BPF_CMD_DONE:
ctx->parsed = true;
@@ -301,6 +305,23 @@ static int kexec_buff_parser(struct bpf_parser_context *parser)
vfree(ctx->kernel);
ctx->kernel = decompressed_buf;
ctx->kernel_sz = decompressed_sz;
+ if (fill_pipeline) {
+ int i;
+
+ for (i = 0; i < MAX_PARSING_BUF_NUM; i++) {
+ if (ctx->next_parsing_buf[i])
+ continue;
+ ctx->next_parsing_buf[i] = decompressed_buf;
+ ctx->next_parsing_buf_sz[i] = decompressed_sz;
+ break;
+ }
+ /* No enough parsing slot */
+ if (i == MAX_PARSING_BUF_NUM) {
+ ctx->kernel = NULL;
+ vfree(decompressed_buf);
+ return -ENOMEM;
+ }
+ }
break;
default:
vfree(decompressed_buf);
@@ -313,6 +334,22 @@ static int kexec_buff_parser(struct bpf_parser_context *parser)
if (!p)
return -ENOMEM;
memcpy(p, buf, cmd->payload_len);
+ if (fill_pipeline) {
+ pn = __vmalloc(cmd->payload_len, GFP_KERNEL | __GFP_ACCOUNT);
+ if (!pn) {
+ vfree(p);
+ return -ENOMEM;
+ }
+ memcpy(pn, buf, cmd->payload_len);
+ for (int i = 0; i < MAX_PARSING_BUF_NUM; i++) {
+ if (!ctx->next_parsing_buf[i]) {
+ ctx->next_parsing_buf[i] = pn;
+ ctx->next_parsing_buf_sz[i] = cmd->payload_len;
+ break;
+ }
+ }
+ }
+
switch (cmd->subcmd) {
case KEXEC_BPF_SUBCMD_KERNEL:
vfree(ctx->kernel);
@@ -637,6 +674,14 @@ static int process_bpf_parsers_container(const char *elf_buf, size_t elf_sz,
context->parsing_buf[i] = NULL;
context->parsing_buf_sz[i] = 0;
}
+ for (int i = 0; i < MAX_PARSING_BUF_NUM; i++) {
+ if (!context->next_parsing_buf[i])
+ break;
+ context->parsing_buf[i] = context->next_parsing_buf[i];
+ context->parsing_buf_sz[i] = context->next_parsing_buf_sz[i];
+ context->next_parsing_buf[i] = NULL;
+ context->next_parsing_buf_sz[i] = 0;
+ }
put_bpf_parser_context(bpf);
/* If the bpf-prog success, it flags by KEXEC_BPF_CMD_DONE */
--
2.49.0
next prev parent reply other threads:[~2026-03-22 1:46 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-22 1:43 [PATCHv7 00/13] kexec: Use BPF lskel to enable kexec to load PE format boot image Pingfan Liu
2026-03-22 1:43 ` [PATCHv7 01/13] bpf: Introduce kfuncs to parser buffer content Pingfan Liu
2026-03-22 2:14 ` bot+bpf-ci
2026-08-13 22:20 ` sashiko-bot
2026-03-22 1:43 ` [PATCHv7 02/13] kexec_file: Use bpf-prog to decompose image Pingfan Liu
2026-03-22 2:14 ` bot+bpf-ci
2026-03-22 1:43 ` [PATCHv7 03/13] lib/decompress: Keep decompressor when CONFIG_KEEP_DECOMPRESSOR Pingfan Liu
2026-03-22 2:26 ` bot+bpf-ci
2026-03-22 1:43 ` [PATCHv7 04/13] kexec_file: Implement decompress method for parser Pingfan Liu
2026-03-22 2:26 ` bot+bpf-ci
2026-03-22 1:43 ` [PATCHv7 05/13] kexec_file: Implement copy " Pingfan Liu
2026-03-22 1:43 ` Pingfan Liu [this message]
2026-03-22 2:14 ` [PATCHv7 06/13] kexec_file: Chain the stages into a pipeline bot+bpf-ci
2026-08-13 22:32 ` sashiko-bot
2026-03-22 1:43 ` [PATCHv7 07/13] kexec_file: Introduce a bpf-prog lskel to run a format parser Pingfan Liu
2026-03-22 1:43 ` [PATCHv7 08/13] kexec_file: Factor out routine to find a symbol in ELF Pingfan Liu
2026-03-22 2:14 ` bot+bpf-ci
2026-03-23 7:07 ` kernel test robot
2026-03-23 10:19 ` kernel test robot
2026-03-22 1:43 ` [PATCHv7 09/13] kexec_file: Integrate bpf light skeleton to load image with bpf-prog Pingfan Liu
2026-03-22 2:14 ` bot+bpf-ci
2026-03-22 1:43 ` [PATCHv7 10/13] arm64/kexec: Select KEXEC_BPF to support UEFI-style kernel image Pingfan Liu
2026-03-22 1:44 ` [PATCHv7 11/13] tools/kexec: Introduce a bpf-prog to handle zboot image Pingfan Liu
2026-03-22 2:26 ` bot+bpf-ci
2026-03-22 1:44 ` [PATCHv7 12/13] tools/kexec: Introduce a bpf-prog to handle UKI image Pingfan Liu
2026-08-13 22:41 ` sashiko-bot
2026-03-22 1:44 ` [PATCHv7 13/13] tools/kexec: Introduce a tool to build zboot envelop Pingfan Liu
2026-03-23 19:02 ` [PATCHv7 00/13] kexec: Use BPF lskel to enable kexec to load PE format boot image Andrew Morton
2026-03-24 7:09 ` Pingfan Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260322014402.8815-7-piliu@redhat.com \
--to=piliu@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=ardb@kernel.org \
--cc=ast@kernel.org \
--cc=bhe@redhat.com \
--cc=bpf@vger.kernel.org \
--cc=catalin.marinas@arm.com \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=dyoung@redhat.com \
--cc=eddyz87@gmail.com \
--cc=horms@kernel.org \
--cc=jeremy.linton@arm.com \
--cc=john.fastabend@gmail.com \
--cc=kernel@jfarr.cc \
--cc=kexec@lists.infradead.org \
--cc=kraxel@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=prudo@redhat.com \
--cc=song@kernel.org \
--cc=systemd-devel@lists.freedesktop.org \
--cc=vkuznets@redhat.com \
--cc=vmalik@redhat.com \
--cc=will@kernel.org \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.