Message ID | 20230602085239.91138-7-laoar.shao@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | bpf: Support ->fill_link_info for kprobe prog | expand |
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@gmail.com> > --- > 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?
On Sat, Jun 3, 2023 at 4:38 AM Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > > 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@gmail.com> > > --- > > 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? Sure, I will use 'name' instead.
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); + break; default: break; } @@ -498,6 +510,7 @@ static int do_show_link(int fd) int count; int err; + buf[0] = '\0'; memset(&info, 0, sizeof(info)); again: err = bpf_link_get_info_by_fd(fd, &info, &len); @@ -533,6 +546,12 @@ static int do_show_link(int fd) goto again; } } + if (info.type == BPF_LINK_TYPE_PERF_EVENT && + !info.perf_event.name) { + info.perf_event.name = (unsigned long)&buf; + info.perf_event.name_len = sizeof(buf); + goto again; + } if (json_output) show_link_close_json(fd, &info);
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@gmail.com> --- tools/bpf/bpftool/link.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)