On Wed, Dec 22, 2021 at 5:44 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > On Tue, Dec 21, 2021 at 01:58:14PM -0800, Andrii Nakryiko wrote: > > On Tue, Dec 21, 2021 at 12:23 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > > > > > On Thu, Dec 16, 2021 at 02:21:08PM -0800, Christy Lee wrote: > > > > bpf__object_next is deprecated, track bpf_objects directly in > > > > perf instead. > > > > > > > > Signed-off-by: Christy Lee <christylee@xxxxxx> > > > > Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > > > --- > > > > tools/perf/util/bpf-loader.c | 72 +++++++++++++++++++++++++++--------- > > > > tools/perf/util/bpf-loader.h | 1 + > > > > 2 files changed, 55 insertions(+), 18 deletions(-) > > > > > > > > diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c > > > > index 528aeb0ab79d..9e3988fd719a 100644 > > > > --- a/tools/perf/util/bpf-loader.c > > > > +++ b/tools/perf/util/bpf-loader.c > > > > @@ -29,9 +29,6 @@ > > > > > > > > #include <internal/xyarray.h> > > > > > > > > -/* temporarily disable libbpf deprecation warnings */ > > > > -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" > > > > - > > > > static int libbpf_perf_print(enum libbpf_print_level level __attribute__((unused)), > > > > const char *fmt, va_list args) > > > > { > > > > @@ -49,6 +46,36 @@ struct bpf_prog_priv { > > > > int *type_mapping; > > > > }; > > > > > > > > +struct bpf_perf_object { > > > > + struct bpf_object *obj; > > > > + struct list_head list; > > > > +}; > > > > + > > > > +static LIST_HEAD(bpf_objects_list); > > > > > > hum, so this duplicates libbpf's bpf_objects_list, > > > how do objects get on this list? > > > > yep, this list needs to be updated on perf side each time > > bpf_object__open() (and any variant of open) is called. > > > > > > > > could you please put more comments in changelog > > > and share how you tested this? > > > > I actually have no idea how to test this as well, can you please share > > some ideas? > > > > I don't use it, I just know it's there.. that's why I asked ;-) > > it's possible to specify bpf program on the perf command line > to be attached to event, like: > > # cat tools/perf/examples/bpf/hello.c > #include <stdio.h> > > int syscall_enter(openat)(void *args) > { > puts("Hello, world\n"); > return 0; > } > > license(GPL); > # > # perf trace -e openat,tools/perf/examples/bpf/hello.c cat /etc/passwd > /dev/null > 0.016 ( ): __bpf_stdout__:Hello, world > 0.018 ( 0.010 ms): cat/9079 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC) = 3 > 0.057 ( ): __bpf_stdout__:Hello, world > 0.059 ( 0.011 ms): cat/9079 openat(dfd: CWD, filename: /lib64/libc.so.6, flags: CLOEXEC) = 3 > 0.417 ( ): __bpf_stdout__:Hello, world > 0.419 ( 0.009 ms): cat/9079 openat(dfd: CWD, filename: /etc/passwd) = 3 > # > > I took that example from commit message > > > > > BTW, while we are at it, Jiri, do you have any good ideas on how to > > remove perf's usage of bpf_program__set_priv() and > > bpf_program__set_prep() APIs in perf code base? These APIs are > > deprecated as well, but seems like perf relies on them pretty heavily. > > What would be the best way to stop using them? > > > > For set_priv(), I think it should be totally fine to maintain a > > separate lookup hash table by `struct bpf_program *` or its name, that > > shouldn't be hard. > > ok, so there's no alternative api for this one then nope > > > > > But for set_prep(), what does perf use it for? I assume for cloning > > BPF programs, right? Anything else besides that? If it's just for > > cloning, libbpf provides bpf_program__insns() API to get access to > > underlying bpf_insn array, do you think it's possible to switch perf > > to that instead? > > look like it's used to generate prologs for programs: > a08357d8dc7d perf bpf: Generate prologue for BPF programs > > the author Wang Nan haven't touched that for some time, > I'm cc-ing other folks that were involved.. Arnaldo? ;-) > > if nobody volunteers, I can check on that thanks! I appreciate the help with moving perf away for libbpf's obscure and deprecated APIs. > > jirka >