> On 14-Dec-2022, at 9:21 PM, Arnaldo Carvalho de Melo <a...@kernel.org > <mailto:a...@kernel.org>> wrote: > > Em Tue, Dec 13, 2022 at 03:21:03PM +0530, Athira Rajeev escreveu: >>> On 13-Dec-2022, at 12:27 AM, Arnaldo Carvalho de Melo <a...@kernel.org >>> <mailto:a...@kernel.org>> wrote: >>> Em Thu, Nov 03, 2022 at 12:27:01PM +0530, Athira Rajeev escreveu: >>>>> On 28-Oct-2022, at 9:12 PM, Kajol Jain <kj...@linux.ibm.com >>>>> <mailto:kj...@linux.ibm.com>> wrote: >>>>> >>>>> Perf BPF filter test fails in environment where "kernel-debuginfo" >>>>> is not installed. >>>>> >>>>> Test failure logs: >>>>> <<>> >>>>> 42: BPF filter : >>>>> 42.1: Basic BPF filtering : Ok >>>>> 42.2: BPF pinning : Ok >>>>> 42.3: BPF prologue generation : FAILED! >>>>> <<>> >>>>> >>>>> Enabling verbose option provided debug logs, which says debuginfo >>>>> needs to be installed. Snippet of verbose logs: >>>>> >>>>> <<>> >>>>> 42.3: BPF prologue generation : >>>>> --- start --- >>>>> test child forked, pid 28218 >>>>> <<>> >>>>> Rebuild with CONFIG_DEBUG_INFO=y, or install an appropriate debuginfo >>>>> package. >>>>> bpf_probe: failed to convert perf probe events >>>>> Failed to add events selected by BPF >>>>> test child finished with -1 >>>>> ---- end ---- >>>>> BPF filter subtest 3: FAILED! >>>>> <<>> >>>>> >>>>> Here subtest, "BPF prologue generation" failed and >>>>> logs shows debuginfo is needed. After installing >>>>> kernel-debuginfo package, testcase passes. >>>>> >>>>> Subtest "BPF prologue generation" failed because, the "do_test" >>>>> function returns "TEST_FAIL" without checking the error type >>>>> returned by "parse_events_load_bpf_obj" function. >>>>> Function parse_events_load_bpf_obj can also return error of type >>>>> "-ENOENT" incase kernel-debuginfo package is not installed. Fix this >>>>> by adding check for -ENOENT error. >>>>> >>>>> Test result after the patch changes: >>>>> >>>>> Test failure logs: >>>>> <<>> >>>>> 42: BPF filter : >>>>> 42.1: Basic BPF filtering : Ok >>>>> 42.2: BPF pinning : Ok >>>>> 42.3: BPF prologue generation : Skip (clang/debuginfo isn't >>>>> installed or environment missing BPF support) >>>>> >>>>> Fixes: ba1fae431e74bb42 ("perf test: Add 'perf test BPF'") >>>>> Signed-off-by: Kajol Jain <kj...@linux.ibm.com >>>>> <mailto:kj...@linux.ibm.com>> >>>>> Reviewed-by: Madhavan Srinivasan <ma...@linux.ibm.com >>>>> <mailto:ma...@linux.ibm.com>> >>>>> --- >>>>> tools/perf/tests/bpf.c | 6 +++++- >>>>> 1 file changed, 5 insertions(+), 1 deletion(-) >>>>> >>>>> diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c >>>>> index 17c023823713..57cecadc1da2 100644 >>>>> --- a/tools/perf/tests/bpf.c >>>>> +++ b/tools/perf/tests/bpf.c >>>>> @@ -126,6 +126,10 @@ static int do_test(struct bpf_object *obj, int >>>>> (*func)(void), >>>>> >>>>> err = parse_events_load_bpf_obj(&parse_state, &parse_state.list, obj, >>>>> NULL); >>>>> parse_events_error__exit(&parse_error); >>>>> + if (err == -ENOENT) { >>>>> + pr_debug("Failed to add events selected by BPF, debuginfo >>>>> package not installed\n"); >>>>> + return TEST_SKIP; >>>>> + } >>>> >>>> Hi Kajol, >>>> >>>> Here, you have used ENOENT to skip the test. But there could be other >>>> places in the code path for “parse_events_load_bpf_obj” >>>> which also returns ENOENT. In that case, for any exit that returns ENOENT, >>>> test will get skipped. >>>> >>>> Can we look at the logs, example we have this in commit logs: >>>> >>>> Rebuild with CONFIG_DEBUG_INFO=y, or install an appropriate debuginfo >>>> package. >>>> >>>> so as to decide whether to skip for debug info ? >>> >>> Kajol? > >> Hi Arnaldo, looking for your suggestion on how to handle the case where >> debuginfo is missing. > >> Here the bpf test fails because of missing debuginfo. The function >> which goes through the debuginfo check is "parse_events_load_bpf_obj" >> . parse_events_load_bpf_obj internally calls "open_debuginfo" which >> returns ENOENT when debuginfo is missing. The patch fix from Kajol is >> to skip the test using error code ENOENT for debuginfo. > > Lets see: > > root@roc-rk3399-pc:~# uname -a > Linux roc-rk3399-pc 6.1.0-rc5-00123-g4dd7ff4a0311 #2 SMP PREEMPT Wed Nov 16 > 19:55:11 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux > root@roc-rk3399-pc:~# perf probe -x ~/bin/perf open_debuginfo > Added new event: > probe_perf:open_debuginfo (on open_debuginfo in /home/acme/bin/perf) > > You can now use it in all perf tools, such as: > > perf record -e probe_perf:open_debuginfo -aR sleep 1 > > root@roc-rk3399-pc:~# > > root@roc-rk3399-pc:~# perf trace --call-graph=dwarf -a -e probe_perf:* perf > test bpf > 40: LLVM search and compile : > 40.1: Basic BPF llvm compile : Ok > 40.3: Compile source for BPF prologue generation : FAILED! > 40.4: Compile source for BPF relocation : Ok > 42: BPF filter : > 42.1: Basic BPF filtering : > 0.000 perf/38363 probe_perf:open_debuginfo(__probe_ip: 187650778659428) > open_debuginfo (/home/acme/bin/perf) > try_to_find_probe_trace_events (inlined) > convert_to_probe_trace_events (inlined) > convert_perf_probe_events > (/home/acme/bin/perf) > bpf__probe (/home/acme/bin/perf) > parse_events_load_bpf_obj > (/home/acme/bin/perf) > do_test (/home/acme/bin/perf) > FAILED! > 42.2: BPF pinning : > 5594.218 perf/38582 probe_perf:open_debuginfo(__probe_ip: 187650778659428) > open_debuginfo (/home/acme/bin/perf) > try_to_find_probe_trace_events (inlined) > convert_to_probe_trace_events (inlined) > convert_perf_probe_events > (/home/acme/bin/perf) > bpf__probe (/home/acme/bin/perf) > parse_events_load_bpf_obj > (/home/acme/bin/perf) > do_test (/home/acme/bin/perf) > FAILED! > 42.3: BPF prologue generation : FAILED! > 63: Test libpfm4 support : > 99: perf stat --bpf-counters test : Skip > 100: perf stat --bpf-counters --for-each-cgroup test : Skip > root@roc-rk3399-pc:~# > > So that is the callchains leading to open_debuginfo(), perhaps we should > return ENODATA at try_to_find_probe_trace_events() when open_debuginfo() > fails?
Hi Arnaldo, Thanks for the suggestions. I tried with changing return code to ENODATA when open_debuginfo fails and will send a separate patch addressing this change. > > ⬢[acme@toolbox perf]$ find tools/perf/ -name "*.[ch]" | xargs grep > try_to_find_probe_trace_events > tools/perf/util/probe-event.c:static int > try_to_find_probe_trace_events(struct perf_probe_event *pev, > tools/perf/util/probe-event.c:static int > try_to_find_probe_trace_events(struct perf_probe_event *pev, > tools/perf/util/probe-event.c: ret = > try_to_find_probe_trace_events(pev, tevs); > ⬢[acme@toolbox perf]$ > > Also it returns ENOENT as well when not finding the probe point... There > we should return perhaps ENOSYM? ENOSYM is not defined for all the archs. arch/parisc/include/uapi/asm/errno.h:#define ENOSYM 215 /* symbol does not exist in executable */ So we need to make this error code generic to use in probe-event. Shall we make this error code generic for all archs to use ? Thanks Athira > >> But issue with using this return code is that, there are other places >> in the code path for "parse_events_load_bpf_obj" which also returns >> ENOENT. In that case, for any exit path that returns ENOENT, test will >> get skipped. Hence looking for an alternative way to identify missing >> debuginfo to skip the test. Please share your thoughts on this. > > See above. > > - Arnaldo