[PATCH] bpf: test_run: reduce kernel stack usage

From: Arnd Bergmann

Date: Fri May 15 2026 - 07:51:08 EST


From: Arnd Bergmann <arnd@xxxxxxxx>

The xdp_test_data structure is really too large to put on the stack
and results in one of the largest stack frames in the kernel:

net/bpf/test_run.c: In function 'bpf_test_run_xdp_live':
net/bpf/test_run.c:387:1: error: the frame size of 1608 bytes is larger than 1536 bytes [-Werror=frame-larger-than=]

Reduce this using dynamic allocation, which avoids around 1KB of
stack usage.

Fixes: b530e9e1063e ("bpf: Add "live packet" mode for XDP in BPF_PROG_RUN")
Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
---
found while build testing s390 with gcc-16, had not seen this on
other architectures before.
---
net/bpf/test_run.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index c9aea7052ba7..763891df02be 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -362,27 +362,31 @@ static int bpf_test_run_xdp_live(struct bpf_prog *prog, struct xdp_buff *ctx,
u32 repeat, u32 batch_size, u32 *time)

{
- struct xdp_test_data xdp = { .batch_size = batch_size };
+ struct xdp_test_data *xdp __free(kfree) = kzalloc_obj(*xdp);
struct bpf_test_timer t = {};
int ret;

+ if (!xdp)
+ return -ENOMEM;
+
if (!repeat)
repeat = 1;

- ret = xdp_test_run_setup(&xdp, ctx);
+ xdp->batch_size = batch_size;
+ ret = xdp_test_run_setup(xdp, ctx);
if (ret)
return ret;

bpf_test_timer_enter(&t);
do {
- xdp.frame_cnt = 0;
- ret = xdp_test_run_batch(&xdp, prog, repeat - t.i);
+ xdp->frame_cnt = 0;
+ ret = xdp_test_run_batch(xdp, prog, repeat - t.i);
if (unlikely(ret < 0))
break;
- } while (bpf_test_timer_continue(&t, xdp.frame_cnt, repeat, &ret, time));
+ } while (bpf_test_timer_continue(&t, xdp->frame_cnt, repeat, &ret, time));
bpf_test_timer_leave(&t);

- xdp_test_run_teardown(&xdp);
+ xdp_test_run_teardown(xdp);
return ret;
}

--
2.39.5