On Thu, Feb 20, 2020 at 9:53 AM KP Singh <kpsingh@xxxxxxxxxxxx> wrote: > > From: KP Singh <kpsingh@xxxxxxxxxx> > > Since BPF_PROG_TYPE_LSM uses the same attaching mechanism as > BPF_PROG_TYPE_TRACING, the common logic is refactored into a static > function bpf_program__attach_btf. > > A new API call bpf_program__attach_lsm is still added to avoid userspace > conflicts if this ever changes in the future. > > Signed-off-by: KP Singh <kpsingh@xxxxxxxxxx> > --- > tools/lib/bpf/bpf.c | 3 ++- > tools/lib/bpf/libbpf.c | 46 ++++++++++++++++++++++++++++++++-------- > tools/lib/bpf/libbpf.h | 4 ++++ > tools/lib/bpf/libbpf.map | 3 +++ > 4 files changed, 46 insertions(+), 10 deletions(-) > > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index c6dafe563176..73220176728d 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -235,7 +235,8 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, > memset(&attr, 0, sizeof(attr)); > attr.prog_type = load_attr->prog_type; > attr.expected_attach_type = load_attr->expected_attach_type; > - if (attr.prog_type == BPF_PROG_TYPE_STRUCT_OPS) { > + if (attr.prog_type == BPF_PROG_TYPE_STRUCT_OPS || > + attr.prog_type == BPF_PROG_TYPE_LSM) { > attr.attach_btf_id = load_attr->attach_btf_id; > } else if (attr.prog_type == BPF_PROG_TYPE_TRACING || > attr.prog_type == BPF_PROG_TYPE_EXT) { > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 514b1a524abb..d11139d5e76b 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -2351,16 +2351,14 @@ static int bpf_object__finalize_btf(struct bpf_object *obj) > > static inline bool libbpf_prog_needs_vmlinux_btf(struct bpf_program *prog) > { > - if (prog->type == BPF_PROG_TYPE_STRUCT_OPS) > + if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || > + prog->type == BPF_PROG_TYPE_LSM) > return true; > > /* BPF_PROG_TYPE_TRACING programs which do not attach to other programs > * also need vmlinux BTF > */ > - if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) > - return true; > - > - return false; > + return prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd; please keep this as is, it allows to add more logic easily, if necessary > } > > static int bpf_object__load_vmlinux_btf(struct bpf_object *obj) > @@ -4855,7 +4853,8 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, > load_attr.insns = insns; > load_attr.insns_cnt = insns_cnt; > load_attr.license = license; [...] > -struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) > +/* Common logic for all BPF program types that attach to a btf_id */ > +static struct bpf_link *bpf_program__attach_btf(struct bpf_program *prog) > { > char errmsg[STRERR_BUFSIZE]; > struct bpf_link_fd *link; > @@ -7376,7 +7388,7 @@ struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) > if (pfd < 0) { > pfd = -errno; > free(link); > - pr_warn("program '%s': failed to attach to trace: %s\n", > + pr_warn("program '%s': failed to attach to: %s\n", to attach to ... what?.. %s at the end is just an error message > bpf_program__title(prog, false), > libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); > return ERR_PTR(pfd); > @@ -7385,10 +7397,26 @@ struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) > return (struct bpf_link *)link; > } > [...] > --- a/tools/lib/bpf/libbpf.map > +++ b/tools/lib/bpf/libbpf.map > @@ -227,10 +227,13 @@ LIBBPF_0.0.7 { > bpf_probe_large_insn_limit; > bpf_prog_attach_xattr; > bpf_program__attach; > + bpf_program__attach_lsm; > bpf_program__name; > bpf_program__is_extension; > + bpf_program__is_lsm; > bpf_program__is_struct_ops; > bpf_program__set_extension; > + bpf_program__set_lsm; please make sure to add to 0.0.8 version for new revision > bpf_program__set_struct_ops; > btf__align_of; > libbpf_find_kernel_btf; > -- > 2.20.1 >