Re: [PATCH bpf-next] selftest/bpf: make pyperf600 a success again
Pu Lehui <[email protected]>
| Newsgroups | org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
On 2026/8/14 7:29, Andrii Nakryiko wrote: > pyperf600 has been running into 8K BPF_COMPLEXITY_LIMIT_JMP_SEQ limitations > for a long while now, after some internal compiler changes. > > Until BPF verifier is bestowed with scalar evolution logic, make that test > actually work by doing what would anyone should do in such situations: by > moving repeatable per-iteration work into independently verified global > functions. > > `void *` argument is a problem for global funcs, but a static function wrapper > doing necessary casts and a bit of __arg_nonnull magic dust is all it takes. > > Signed-off-by: Andrii Nakryiko <[email protected]> > --- > tools/testing/selftests/bpf/progs/pyperf.h | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/bpf/progs/pyperf.h b/tools/testing/selftests/bpf/progs/pyperf.h > index 86484f07e1d1..fd93a96e5901 100644 > --- a/tools/testing/selftests/bpf/progs/pyperf.h > +++ b/tools/testing/selftests/bpf/progs/pyperf.h > @@ -85,9 +85,11 @@ static void *get_thread_state(void *tls_base, PidData *pidData) > return thread_state; > } > > -static __always_inline bool get_frame_data(void *frame_ptr, PidData *pidData, > - FrameData *frame, Symbol *symbol) > +__weak bool __get_frame_data(long frame_ptr_, PidData *pidData __arg_nonnull, > + FrameData *frame __arg_nonnull, Symbol *symbol __arg_nonnull) > { > + void *frame_ptr = (void *)frame_ptr_; > + > // read data from PyFrameObject > bpf_probe_read_user(&frame->f_back, > sizeof(frame->f_back), > @@ -119,6 +121,12 @@ static __always_inline bool get_frame_data(void *frame_ptr, PidData *pidData, > return true; > } > > +static __always_inline bool get_frame_data(void *frame_ptr, PidData *pidData, > + FrameData *frame, Symbol *symbol) > +{ > + return __get_frame_data((long)frame_ptr, pidData, frame, symbol); > +} > + > struct { > __uint(type, BPF_MAP_TYPE_HASH); > __uint(max_entries, 1); riscv bpf suffers this issue too, happy to see this fix. feel free to add: Reviewed-by: Pu Lehui <[email protected]> Tested-by: Pu Lehui <[email protected]> # riscv