From: Arnd Bergmann 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 --- 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