On Mon, Jun 16, 2025 at 6:03 AM Tao Chen <chen.dylane@xxxxxxxxx> wrote: > > Show kprobe_multi link info with fdinfo, the info as follows: > > link_type: kprobe_multi > link_id: 1 > prog_tag: a15b7646cb7f3322 > prog_id: 21 > type: kprobe_multi > kprobe_cnt: 8 > missed: 0 > cookie func > 1 bpf_fentry_test1 > 7 bpf_fentry_test2 > 2 bpf_fentry_test3 > 3 bpf_fentry_test4 > 4 bpf_fentry_test5 > 5 bpf_fentry_test6 > 6 bpf_fentry_test7 > 8 bpf_fentry_test8 > > Signed-off-by: Tao Chen <chen.dylane@xxxxxxxxx> > --- > kernel/trace/bpf_trace.c | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c > index 2d422f897ac..fcf19e233b5 100644 > --- a/kernel/trace/bpf_trace.c > +++ b/kernel/trace/bpf_trace.c > @@ -2623,10 +2623,42 @@ static int bpf_kprobe_multi_link_fill_link_info(const struct bpf_link *link, > return err; > } > > +#ifdef CONFIG_PROC_FS > +static void bpf_kprobe_multi_show_fdinfo(const struct bpf_link *link, > + struct seq_file *seq) > +{ > + struct bpf_kprobe_multi_link *kmulti_link; > + char sym[KSYM_NAME_LEN]; > + > + kmulti_link = container_of(link, struct bpf_kprobe_multi_link, link); > + > + seq_printf(seq, > + "type:\t%s\n" > + "kprobe_cnt:\t%u\n" > + "missed:\t%lu\n", > + kmulti_link->flags == BPF_F_KPROBE_MULTI_RETURN ? "kretprobe_multi" : > + "kprobe_multi", > + kmulti_link->cnt, > + kmulti_link->fp.nmissed); > + > + seq_printf(seq, "%-16s %-16s\n", "cookie", "func"); > + for (int i = 0; i < kmulti_link->cnt; i++) { > + sprint_symbol_no_offset(sym, kmulti_link->addrs[i]); > + seq_printf(seq, > + "%-16llu %-16s\n", > + kmulti_link->cookies[i], > + sym); Why call sprint_symbol_no_offset() directly ? %pB is fine. +off doesn't disclose anything. pw-bot: cr