On Fri, Mar 14, 2025 at 02:26:41PM -0300, Arnaldo Carvalho de Melo wrote: > it finds the pair, but then its sc->args has a bogus pointer... I'll see > where this isn't being initialized... Breakpoint 4, trace__find_usable_bpf_prog_entry (trace=0x7fffffffa510, sc=0x1046f10) at builtin-trace.c:3874 3874 bool is_candidate = false; (gdb) n 3876 if (pair == NULL || pair == sc || (gdb) p pair $7 = (struct syscall *) 0x1083c50 (gdb) p pair->name $8 = 0x81478e "accept4" (gdb) n 3877 pair->bpf_prog.sys_enter == trace->skel->progs.syscall_unaugmented) (gdb) p i $9 = 1 (gdb) n 3876 if (pair == NULL || pair == sc || (gdb) n 3880 printf("sc=%p\n", sc); fflush(stdout); (gdb) n sc=0x1046f10 3881 printf("sc->name=%p\n", sc->name); fflush(stdout); (gdb) n sc->name=0x6c66202c786c3830 3882 printf("sc->nr_args=%d, sc->args=%p\n", sc->nr_args, sc->args); fflush(stdout); (gdb) p sc->nr_args $10 = 1935635045 (gdb) p sc->args $11 = (struct tep_format_field *) 0x257830203a6e656c (gdb) p *sc $12 = {e_machine = 540697702, id = 807761968, tp_format = 0x657075202c786c38, nr_args = 1935635045, args_size = 1634427759, bpf_prog = {sys_enter = 0x257830203a726464, sys_exit = 0x7075202c786c3830}, is_exit = 101, is_open = 101, nonexistent = 114, use_btf = 95, args = 0x257830203a6e656c, name = 0x6c66202c786c3830 <error: Cannot access memory at address 0x6c66202c786c3830>, fmt = 0x257830203a736761, arg_fmt = 0x786c3830} (gdb) Ok, ran out of time, but if I simple avoid the second loop in: static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace, int e_machine) I.e. the one that starts with: /* * Now lets do a second pass looking for enabled syscalls without * an augmenter that have a signature that is a superset of another * syscall with an augmenter so that we can auto-reuse it. This: diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index e0434f7dc67cb988..3664bb512c70cabf 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -3989,6 +3989,8 @@ static int trace__init_syscalls_bpf_prog_array_maps(struct trace *trace, int e_m goto out; } + return 0; + /* * Now lets do a second pass looking for enabled syscalls without * an augmenter that have a signature that is a superset of another ⬢ [acme@toolbox perf-tools-next]$ Then all works, we don't reuse any BPF program, but then that is an heuristic anyway, that is tried becuase landlock_add_rule has a pointer argument: root@number:~# perf trace -e landlock_add_rule perf test -w landlock 0.000 ( 0.003 ms): perf/71034 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_PATH_BENEATH, rule_attr: 0x7fff6f2bb550, flags: 45) = -1 EINVAL (Invalid argument) 0.004 ( 0.001 ms): perf/71034 landlock_add_rule(ruleset_fd: 11, rule_type: LANDLOCK_RULE_NET_PORT, rule_attr: 0x7fff6f2bb540, flags: 45) = -1 EINVAL (Invalid argument) root@number:~# perf test enum 105: perf trace enum augmentation tests : Ok root@number:~# So its some sort of syncronization on the various new tables, sorted by name, etc that then when iterating over the syscalls ends up using a sc that is not initialized. - Arnaldo