> On Nov 7, 2019, at 8:20 PM, Andrii Nakryiko <andriin@xxxxxx> wrote: > > Add detection of BPF_F_MMAPABLE flag support for arrays and add it as an extra > flag to internal global data maps, if supported by kernel. This allows users > to memory-map global data and use it without BPF map operations, greatly > simplifying user experience. > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> Acked-by: Song Liu <songliubraving@xxxxxx> With nit below. > --- > tools/lib/bpf/libbpf.c | 31 +++++++++++++++++++++++++++++-- > 1 file changed, 29 insertions(+), 2 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index fde6cb3e5d41..73607a31a068 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -142,6 +142,8 @@ struct bpf_capabilities { > __u32 btf_func:1; > /* BTF_KIND_VAR and BTF_KIND_DATASEC support */ > __u32 btf_datasec:1; > + /* BPF_F_MMAPABLE is supported for arrays */ > + __u32 array_mmap:1; > }; > > /* > @@ -855,8 +857,6 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, > pr_warn("failed to alloc map name\n"); > return -ENOMEM; > } > - pr_debug("map '%s' (global data): at sec_idx %d, offset %zu.\n", > - map_name, map->sec_idx, map->sec_offset); > > def = &map->def; > def->type = BPF_MAP_TYPE_ARRAY; > @@ -864,6 +864,12 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, > def->value_size = data->d_size; > def->max_entries = 1; > def->map_flags = type == LIBBPF_MAP_RODATA ? BPF_F_RDONLY_PROG : 0; > + if (obj->caps.array_mmap) > + def->map_flags |= BPF_F_MMAPABLE; > + > + pr_debug("map '%s' (global data): at sec_idx %d, offset %zu, flags %u.\n", nit: Better print flags as %x.