On Fri, Nov 29, 2024 at 5:29 AM Anton Protopopov <aspsk@xxxxxxxxxxxxx> wrote: > > Add new fd_array_cnt field to bpf_prog_load_opts > and pass it in bpf_attr, if set. > > Signed-off-by: Anton Protopopov <aspsk@xxxxxxxxxxxxx> > --- > tools/lib/bpf/bpf.c | 5 +++-- > tools/lib/bpf/bpf.h | 5 ++++- > tools/lib/bpf/features.c | 2 +- > 3 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index becdfa701c75..0e7f59224936 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -105,7 +105,7 @@ int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts) > */ > int probe_memcg_account(int token_fd) > { > - const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd); > + const size_t attr_sz = offsetofend(union bpf_attr, fd_array_cnt); Thankfully this function doesn't set fd_array_cnt below. Otherwise the detection of memcg would fail on older kernels. Let's avoid people mindlessly adding init of fd_array_cnt here by accident. Simply keep this line as-is. offsetofend(.., prog_token_fd) is fine. > struct bpf_insn insns[] = { > BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns), > BPF_EXIT_INSN(), > @@ -238,7 +238,7 @@ int bpf_prog_load(enum bpf_prog_type prog_type, > const struct bpf_insn *insns, size_t insn_cnt, > struct bpf_prog_load_opts *opts) > { > - const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd); > + const size_t attr_sz = offsetofend(union bpf_attr, fd_array_cnt); > void *finfo = NULL, *linfo = NULL; > const char *func_info, *line_info; > __u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd; > @@ -311,6 +311,7 @@ int bpf_prog_load(enum bpf_prog_type prog_type, > attr.line_info_cnt = OPTS_GET(opts, line_info_cnt, 0); > > attr.fd_array = ptr_to_u64(OPTS_GET(opts, fd_array, NULL)); > + attr.fd_array_cnt = OPTS_GET(opts, fd_array_cnt, 0); > > if (log_level) { > attr.log_buf = ptr_to_u64(log_buf); > diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h > index a4a7b1ad1b63..435da95d2058 100644 > --- a/tools/lib/bpf/bpf.h > +++ b/tools/lib/bpf/bpf.h > @@ -107,9 +107,12 @@ struct bpf_prog_load_opts { > */ > __u32 log_true_size; > __u32 token_fd; > + > + /* if set, provides the length of fd_array */ > + __u32 fd_array_cnt; > size_t :0; > }; > -#define bpf_prog_load_opts__last_field token_fd > +#define bpf_prog_load_opts__last_field fd_array_cnt > > LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type, > const char *prog_name, const char *license, > diff --git a/tools/lib/bpf/features.c b/tools/lib/bpf/features.c > index 760657f5224c..5afc9555d9ac 100644 > --- a/tools/lib/bpf/features.c > +++ b/tools/lib/bpf/features.c > @@ -22,7 +22,7 @@ int probe_fd(int fd) > > static int probe_kern_prog_name(int token_fd) > { > - const size_t attr_sz = offsetofend(union bpf_attr, prog_token_fd); > + const size_t attr_sz = offsetofend(union bpf_attr, fd_array_cnt); Same here. Don't change it.