On Mon, Feb 2, 2026 at 6:43 AM Leon Hwang <[email protected]> wrote: > > With the previous commit adding common attribute support for > BPF_MAP_CREATE, users can now retrieve detailed error messages when map > creation fails via the log_buf field. > > Introduce struct bpf_log_opts with the following fields: > log_buf, log_size, log_level, and log_true_size. > > Extend bpf_map_create_opts with a new field log_opts, allowing users to > capture and inspect log messages on map creation failures. > > Signed-off-by: Leon Hwang <[email protected]> > --- > tools/lib/bpf/bpf.c | 16 +++++++++++++++- > tools/lib/bpf/bpf.h | 17 ++++++++++++++++- > 2 files changed, 31 insertions(+), 2 deletions(-) >
LGTM Acked-by: Andrii Nakryiko <[email protected]> > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index 9d8740761b7a..0c3e40844d80 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -209,6 +209,9 @@ int bpf_map_create(enum bpf_map_type map_type, > const struct bpf_map_create_opts *opts) > { > const size_t attr_sz = offsetofend(union bpf_attr, > excl_prog_hash_size); > + const size_t attr_common_sz = sizeof(struct bpf_common_attr); > + struct bpf_common_attr attr_common; > + struct bpf_log_opts *log_opts; > union bpf_attr attr; > int fd; > > @@ -242,7 +245,18 @@ int bpf_map_create(enum bpf_map_type map_type, > attr.excl_prog_hash = ptr_to_u64(OPTS_GET(opts, excl_prog_hash, > NULL)); > attr.excl_prog_hash_size = OPTS_GET(opts, excl_prog_hash_size, 0); > > - fd = sys_bpf_fd(BPF_MAP_CREATE, &attr, attr_sz); > + log_opts = OPTS_GET(opts, log_opts, NULL); > + if (log_opts && feat_supported(NULL, FEAT_BPF_SYSCALL_COMMON_ATTRS)) { > + memset(&attr_common, 0, attr_common_sz); > + attr_common.log_buf = ptr_to_u64(OPTS_GET(log_opts, log_buf, > NULL)); > + attr_common.log_size = OPTS_GET(log_opts, log_size, 0); > + attr_common.log_level = OPTS_GET(log_opts, log_level, 0); > + fd = sys_bpf_ext_fd(BPF_MAP_CREATE, &attr, attr_sz, > &attr_common, attr_common_sz); > + OPTS_SET(log_opts, log_true_size, attr_common.log_true_size); > + } else { > + fd = sys_bpf_fd(BPF_MAP_CREATE, &attr, attr_sz); > + OPTS_SET(log_opts, log_true_size, 0); > + } > return libbpf_err_errno(fd); > } > > diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h > index 2c8e88ddb674..59673f094f86 100644 > --- a/tools/lib/bpf/bpf.h > +++ b/tools/lib/bpf/bpf.h > @@ -37,6 +37,18 @@ extern "C" { > > LIBBPF_API int libbpf_set_memlock_rlim(size_t memlock_bytes); > > +struct bpf_log_opts { > + size_t sz; /* size of this struct for forward/backward compatibility > */ > + > + char *log_buf; > + __u32 log_size; > + __u32 log_level; > + __u32 log_true_size; please mention in the comment here that this is an out parameter set by the kernel > + > + size_t :0; > +}; > +#define bpf_log_opts__last_field log_true_size > + > struct bpf_map_create_opts { > size_t sz; /* size of this struct for forward/backward compatibility > */ > > @@ -57,9 +69,12 @@ struct bpf_map_create_opts { > > const void *excl_prog_hash; > __u32 excl_prog_hash_size; > + > + struct bpf_log_opts *log_opts; > + > size_t :0; > }; > -#define bpf_map_create_opts__last_field excl_prog_hash_size > +#define bpf_map_create_opts__last_field log_opts > > LIBBPF_API int bpf_map_create(enum bpf_map_type map_type, > const char *map_name, > -- > 2.52.0 >

