On Wed, Dec 18, 2019 at 6:56 PM Andrey Ignatov <rdna@xxxxxx> wrote: > > Introduce a new bpf_prog_attach_xattr function that, in addition to > program fd, target fd and attach type, accepts an extendable struct > bpf_prog_attach_opts. > > bpf_prog_attach_opts relies on DECLARE_LIBBPF_OPTS macro to maintain > backward and forward compatibility and has the following "optional" > attach attributes: > > * existing attach_flags, since it's not required when attaching in NONE > mode. Even though it's quite often used in MULTI and OVERRIDE mode it > seems to be a good idea to reduce number of arguments to > bpf_prog_attach_xattr; > > * newly introduced attribute of BPF_PROG_ATTACH command: replace_prog_fd > that is fd of previously attached cgroup-bpf program to replace if > BPF_F_REPLACE flag is used. > > The new function is named to be consistent with other xattr-functions > (bpf_prog_test_run_xattr, bpf_create_map_xattr, bpf_load_program_xattr). > > The struct bpf_prog_attach_opts is supposed to be used with > DECLARE_LIBBPF_OPTS macro. > > Signed-off-by: Andrey Ignatov <rdna@xxxxxx> > --- > tools/lib/bpf/bpf.c | 16 +++++++++++++++- > tools/lib/bpf/bpf.h | 11 +++++++++++ > tools/lib/bpf/libbpf.map | 1 + > 3 files changed, 27 insertions(+), 1 deletion(-) > > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index 98596e15390f..ebb4f8d71bdb 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -466,6 +466,17 @@ int bpf_obj_get(const char *pathname) > > int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type, > unsigned int flags) > +{ > + DECLARE_LIBBPF_OPTS(bpf_prog_attach_opts, opts, > + .flags = flags, > + ); > + > + return bpf_prog_attach_xattr(prog_fd, target_fd, type, &opts); > +} > + > +int bpf_prog_attach_xattr(int prog_fd, int target_fd, > + enum bpf_attach_type type, > + const struct bpf_prog_attach_opts *opts) > { > union bpf_attr attr; > You need to validate opts with OPTS_VALID macro (see btf_dump__emit_type_decl() for simple example). > @@ -473,7 +484,10 @@ int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type, > attr.target_fd = target_fd; > attr.attach_bpf_fd = prog_fd; > attr.attach_type = type; > - attr.attach_flags = flags; > + if (opts) { > + attr.attach_flags = opts->flags; > + attr.replace_bpf_fd = opts->replace_prog_fd; > + } Please use OPTS_GET() macro to fetch values from opts struct and provide default value if they are not specified. > > return sys_bpf(BPF_PROG_ATTACH, &attr, sizeof(attr)); > } [...]