BACKPORT: bpf: Add map_name to bpf_map_info
authorMartin KaFai Lau <kafai@fb.com>
Wed, 27 Sep 2017 21:37:53 +0000 (14:37 -0700)
committerNolen Johnson <johnsonnolen@gmail.com>
Mon, 25 Mar 2024 17:05:31 +0000 (13:05 -0400)
This patch allows userspace to specify a name for a map
during BPF_MAP_CREATE.

The map's name can later be exported to user space
via BPF_OBJ_GET_INFO_BY_FD.

Change-Id: I96b8d74b09c14f2413d421bba61cfa63d1730bc3
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: Alexei Starovoitov <ast@fb.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/bpf.h
include/uapi/linux/bpf.h
kernel/bpf/syscall.c

index 4cf933f3b0aa811236d6b8c46e110ea22c088faf..54471accf6979e20f813c3c2149461b923de0f49 100644 (file)
@@ -69,6 +69,7 @@ struct bpf_map {
        atomic_t refcnt;
        atomic_t usercnt;
        struct work_struct work;
+       u8 name[BPF_OBJ_NAME_LEN];
 };
 
 /* function argument constraints */
index 143d4a2aedec72ac678e5fd2844aa8d984b100f2..ff5108529961db5728b7657d6e528ca159139704 100644 (file)
@@ -195,6 +195,7 @@ union bpf_attr {
                __u32   numa_node;      /* numa node (effective only if
                                         * BPF_F_NUMA_NODE is set).
                                         */
+               __u8    map_name[BPF_OBJ_NAME_LEN];
        };
 
        struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
@@ -824,6 +825,7 @@ struct bpf_map_info {
        __u32 value_size;
        __u32 max_entries;
        __u32 map_flags;
+       __u8  name[BPF_OBJ_NAME_LEN];
 } __attribute__((aligned(8)));
 
 /* User bpf_sock_ops struct to access socket values and specify request ops
index de4b76cae4fd699ac8a0636ee99b9025bcd21d94..bfac2c4583353d4d2a9fab4a60090d50e173b478 100644 (file)
@@ -379,7 +379,7 @@ static int bpf_obj_name_cpy(char *dst, const char *src)
        return 0;
 }
 
-#define BPF_MAP_CREATE_LAST_FIELD numa_node
+#define BPF_MAP_CREATE_LAST_FIELD map_name
 /* called via syscall */
 static int map_create(union bpf_attr *attr)
 {
@@ -406,6 +406,10 @@ static int map_create(union bpf_attr *attr)
        if (IS_ERR(map))
                return PTR_ERR(map);
 
+       err = bpf_obj_name_cpy(map->name, attr->map_name);
+       if (err)
+               goto free_map_nouncharge;
+
        atomic_set(&map->refcnt, 1);
        atomic_set(&map->usercnt, 1);
 
@@ -1569,6 +1573,7 @@ static int bpf_map_get_info_by_fd(struct bpf_map *map,
        info.value_size = map->value_size;
        info.max_entries = map->max_entries;
        info.map_flags = map->map_flags;
+       memcpy(info.name, map->name, sizeof(map->name));
 
        if (copy_to_user(uinfo, &info, info_len) ||
            put_user(info_len, &uattr->info.info_len))