On 24/12/02 06:34PM, Alexei Starovoitov wrote: > 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. Ok, thanks, reverted (as with the one you've mentioned below) > > 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.