On Fri, Apr 15, 2022 at 9:30 PM Kui-Feng Lee <kuifeng@xxxxxx> wrote: > > Add a cookie field to the attributes of bpf_link_create(). > Add bpf_program__attach_trace_opts() to attach a cookie to a link. > > Signed-off-by: Kui-Feng Lee <kuifeng@xxxxxx> > --- > tools/lib/bpf/bpf.c | 7 +++++++ > tools/lib/bpf/bpf.h | 3 +++ > tools/lib/bpf/libbpf.c | 38 ++++++++++++++++++++++++++++++++++++++ > tools/lib/bpf/libbpf.h | 12 ++++++++++++ > tools/lib/bpf/libbpf.map | 1 + > 5 files changed, 61 insertions(+) > > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index cf27251adb92..1a96fd9b1da9 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -863,6 +863,13 @@ int bpf_link_create(int prog_fd, int target_fd, > if (!OPTS_ZEROED(opts, kprobe_multi)) > return libbpf_err(-EINVAL); > break; > + case BPF_TRACE_FENTRY: > + case BPF_TRACE_FEXIT: > + case BPF_MODIFY_RETURN: also EXT and LSM programs should go through this > + attr.link_create.tracing.cookie = OPTS_GET(opts, tracing.cookie, 0); > + if (!OPTS_ZEROED(opts, tracing)) > + return libbpf_err(-EINVAL); > + break; > default: > if (!OPTS_ZEROED(opts, flags)) > return libbpf_err(-EINVAL); > diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h > index f4b4afb6d4ba..2f9099c945bc 100644 > --- a/tools/lib/bpf/bpf.h > +++ b/tools/lib/bpf/bpf.h > @@ -410,6 +410,9 @@ struct bpf_link_create_opts { > __u32 iter_info_len; > __u32 target_btf_id; > union { > + struct { > + __u64 cookie; > + } tracing; nit: append at the end of the union? > struct { > __u64 bpf_cookie; > } perf_event; > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index bf4f7ac54ebf..7e18fe94bfe5 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -11262,6 +11262,44 @@ struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog) > return bpf_program__attach_btf_id(prog); > } > > +struct bpf_link *bpf_program__attach_trace_opts(const struct bpf_program *prog, > + const struct bpf_trace_opts *opts) > +{ > + char errmsg[STRERR_BUFSIZE]; > + struct bpf_link *link; > + int prog_fd, pfd; > + LIBBPF_OPTS(bpf_link_create_opts, link_opts); > + > + /* Fallback for cookie is 0. Old kernels don't create > + * fentry/fexit links through LINK_CREATE. > + */ > + if (OPTS_GET(opts, cookie, 0)) > + return bpf_program__attach_trace(prog); With my (planned) changes this special casing won't be necessary anymore as using bpf_link_create() will call into bpf_raw_tracepoint_open() on older kernels if cookie is zero (transparently). > + > + prog_fd = bpf_program__fd(prog); > + if (prog_fd < 0) { > + pr_warn("prog '%s': can't attach before loaded\n", prog->name); > + return libbpf_err_ptr(-EINVAL); > + } > + > + link = calloc(1, sizeof(*link)); > + if (!link) > + return libbpf_err_ptr(-ENOMEM); > + link->detach = &bpf_link__detach_fd; > + > + link_opts.tracing.cookie = OPTS_GET(opts, cookie, 0); > + pfd = bpf_link_create(prog_fd, 0, prog->expected_attach_type, &link_opts); > + if (pfd < 0) { > + pfd = -errno; > + free(link); > + pr_warn("prog '%s': failed to attach: %s\n", > + prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); > + return libbpf_err_ptr(pfd); > + } > + link->fd = pfd; > + return (struct bpf_link *)link; just return link? why casting? > +} > + > struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog) > { > return bpf_program__attach_btf_id(prog); > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index 63d66f1adf1a..213de69bc173 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -563,8 +563,20 @@ bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, > LIBBPF_API struct bpf_link * > bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, > const char *tp_name); > + > +struct bpf_trace_opts { > + /* size of this struct, for forward/backward compatibility */ > + size_t sz; > + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ > + __u64 cookie; > +}; > +#define bpf_trace_opts__last_field cookie > + > LIBBPF_API struct bpf_link * > bpf_program__attach_trace(const struct bpf_program *prog); > +LIBBPF_API struct bpf_link * > +bpf_program__attach_trace_opts(const struct bpf_program *prog, const struct bpf_trace_opts *opts); > + > LIBBPF_API struct bpf_link * > bpf_program__attach_lsm(const struct bpf_program *prog); > LIBBPF_API struct bpf_link * > diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map > index 82f6d62176dd..245a0e8677c9 100644 > --- a/tools/lib/bpf/libbpf.map > +++ b/tools/lib/bpf/libbpf.map > @@ -444,6 +444,7 @@ LIBBPF_0.8.0 { > global: > bpf_object__destroy_subskeleton; > bpf_object__open_subskeleton; > + bpf_program__attach_trace_opts; > bpf_program__attach_usdt; > libbpf_register_prog_handler; > libbpf_unregister_prog_handler; > -- > 2.30.2 >