Re: [PATCHv3 bpf-next 08/12] bpf: Remove trace_in argument from __bpf_get_stack
[email protected] Mon, 3 Aug 2026 22:21:34 +0000 (UTC)
| Newsgroups | org.kernel.vger.bpf |
|---|---|
| Message-ID | <fa27c03a75e22229f58d1ccdce161e05fb274645e3072cdd591201f14b4f1cc3@mail.kernel.org> |
--===============6623590544793985245==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
> diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c
> index cdeb6c2e50da0..976c4e4c1af66 100644
> --- a/kernel/bpf/stackmap.c
> +++ b/kernel/bpf/stackmap.c
[ ... ]
> @@ -933,6 +929,32 @@ const struct bpf_func_proto bpf_get_task_stack_sleepable_proto = {
> .arg4_type = ARG_ANYTHING,
> };
>
> +static int __bpf_get_stack_pe(struct perf_callchain_entry *trace, void *buf, u32 size,
> + u64 flags)
> +{
> + bool user_build_id = flags & BPF_F_USER_BUILD_ID;
> + u64 skip = flags & BPF_F_SKIP_FIELD_MASK;
> + bool user = flags & BPF_F_USER_STACK;
> + u32 elem_size, max_depth, nr_trace;
> + bool kernel = !user;
> +
> + if (kernel && user_build_id)
> + return -EINVAL;
> +
> + elem_size = user_build_id ? sizeof(struct bpf_stack_build_id) : sizeof(u64);
> + if (unlikely(size % elem_size))
> + return -EINVAL;
> +
> + max_depth = stack_map_calculate_max_depth(size, elem_size, flags);
> + trace->nr = min_t(u32, trace->nr, max_depth);
> +
> + if (trace->nr < skip)
> + return -EFAULT;
> +
> + nr_trace = callchain_store(trace, buf, elem_size, flags);
> + return callchain_finalize(buf, size, nr_trace, elem_size, flags, false /* !may_fault */);
> +}
This isn't a bug, but would naming this variable trace_nr match
__bpf_get_stack() and the callchain_*() parameters it feeds?
Looking at __bpf_get_stack():
kernel/bpf/stackmap.c:__bpf_get_stack() {
u32 trace_nr, elem_size, max_depth;
...
trace_nr = callchain_store(trace, buf, elem_size, flags);
return callchain_finalize(buf, size, trace_nr, elem_size, flags, may_fault);
}
And the shared helpers both expect trace_nr:
kernel/bpf/stackmap.c:callchain_store(struct perf_callchain_entry *trace, ...) {
for (i = skip; i < trace_nr; i++) {
...
}
return trace_nr - skip;
}
kernel/bpf/stackmap.c:callchain_finalize(void *buf, u32 size, u32 trace_nr, ...) {
u32 copy_len = trace_nr * elem_size;
...
}
The new helper uses nr_trace for the same role, making the two otherwise
parallel functions read differently.
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/30854471987
--===============6623590544793985245==--