On Fri, Jun 02, 2023 at 08:52:39AM +0000, Yafang Shao wrote: > Show the exposed perf_event link info in bpftool. The result as follows, > > $ bpftool link show > 1: perf_event prog 5 > func kernel_clone addr ffffffffb40bc310 offset 0 > bpf_cookie 0 > pids trace(9726) > $ bpftool link show -j > [{"id":1,"type":"perf_event","prog_id":5,"func":"kernel_clone","addr":18446744072435254032,"offset":0,"bpf_cookie":0,"pids":[{"pid":9726,"comm":"trace"}]}] > > Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> > --- > tools/bpf/bpftool/link.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c > index 3b00c07..045f59f 100644 > --- a/tools/bpf/bpftool/link.c > +++ b/tools/bpf/bpftool/link.c > @@ -280,6 +280,12 @@ static int show_link_close_json(int fd, struct bpf_link_info *info) > kernel_syms_show(addrs, info->kprobe_multi.count, 0); > jsonw_end_array(json_wtr); > break; > + case BPF_LINK_TYPE_PERF_EVENT: > + jsonw_string_field(json_wtr, "func", > + u64_to_ptr(info->perf_event.name)); > + jsonw_uint_field(json_wtr, "addr", info->perf_event.addr); > + jsonw_uint_field(json_wtr, "offset", info->perf_event.offset); > + break; > default: > break; > } > @@ -416,7 +422,7 @@ void netfilter_dump_plain(const struct bpf_link_info *info) > static int show_link_close_plain(int fd, struct bpf_link_info *info) > { > struct bpf_prog_info prog_info; > - const char *prog_type_str; > + const char *prog_type_str, *buf; > int err; > > show_link_header_plain(info); > @@ -472,6 +478,12 @@ static int show_link_close_plain(int fd, struct bpf_link_info *info) > addrs = (const __u64 *)u64_to_ptr(info->kprobe_multi.addrs); > kernel_syms_show(addrs, cnt, indent); > break; > + case BPF_LINK_TYPE_PERF_EVENT: > + buf = (const char *)u64_to_ptr(info->perf_event.name); > + if (buf[0] != '\0' || info->perf_event.addr) > + printf("\n\tfunc %s addr %llx offset %d ", buf, > + info->perf_event.addr, info->perf_event.offset); Let's print the name here as well?