Adding tracing_multi link fdinfo support with following output: pos: 0 flags: 02000000 mnt_id: 19 ino: 3091 link_type: tracing_multi link_id: 382 prog_tag: 62073a1123f07ef7 prog_id: 715 cnt: 10 cookie BTF-id func 8 91203 bpf_fentry_test1+0x4/0x10 9 91205 bpf_fentry_test2+0x4/0x10 7 91206 bpf_fentry_test3+0x4/0x20 5 91207 bpf_fentry_test4+0x4/0x20 4 91208 bpf_fentry_test5+0x4/0x20 2 91209 bpf_fentry_test6+0x4/0x20 3 91210 bpf_fentry_test7+0x4/0x10 1 91211 bpf_fentry_test8+0x4/0x10 10 91212 bpf_fentry_test9+0x4/0x10 6 91204 bpf_fentry_test10+0x4/0x10
Signed-off-by: Jiri Olsa <[email protected]> --- kernel/trace/bpf_trace.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 761501ce3a5f..41b691e83dc4 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3618,9 +3618,35 @@ static void bpf_tracing_multi_link_dealloc(struct bpf_link *link) kvfree(tr_link); } +#ifdef CONFIG_PROC_FS +static void bpf_tracing_multi_show_fdinfo(const struct bpf_link *link, + struct seq_file *seq) +{ + struct bpf_tracing_multi_link *tr_link = + container_of(link, struct bpf_tracing_multi_link, link); + bool has_cookies = !!tr_link->cookies; + + seq_printf(seq, "cnt:\t%u\n", tr_link->nodes_cnt); + + seq_printf(seq, "%s\t %s\t %s\n", "cookie", "BTF-id", "func"); + for (int i = 0; i < tr_link->nodes_cnt; i++) { + struct bpf_tracing_multi_node *mnode = &tr_link->nodes[i]; + u32 btf_id; + + bpf_trampoline_unpack_key(mnode->trampoline->key, NULL, &btf_id); + seq_printf(seq, "%llu\t %u\t %pS\n", + has_cookies ? tr_link->cookies[i] : 0, + btf_id, (void *) mnode->trampoline->ip); + } +} +#endif + static const struct bpf_link_ops bpf_tracing_multi_link_lops = { .release = bpf_tracing_multi_link_release, .dealloc_deferred = bpf_tracing_multi_link_dealloc, +#ifdef CONFIG_PROC_FS + .show_fdinfo = bpf_tracing_multi_show_fdinfo, +#endif }; int bpf_tracing_multi_attach(struct bpf_prog *prog, const union bpf_attr *attr) -- 2.53.0
