bpf: enforce all maps having memory usage callback
authorYafang Shao <laoar.shao@gmail.com>
Sun, 5 Mar 2023 12:46:15 +0000 (12:46 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 7 Mar 2023 17:33:43 +0000 (09:33 -0800)
We have implemented memory usage callback for all maps, and we enforce
any newly added map having a callback as well. We check this callback at
map creation time. If it doesn't have the callback, we will return
EINVAL.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Link: https://lore.kernel.org/r/20230305124615.12358-19-laoar.shao@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/syscall.c

index 053409d951d274882a64807d16309d60d1d84516..f406dfa137924a1da1613dc3415d0eb5fe90b071 100644 (file)
@@ -129,6 +129,8 @@ static struct bpf_map *find_and_alloc_map(union bpf_attr *attr)
        }
        if (attr->map_ifindex)
                ops = &bpf_map_offload_ops;
+       if (!ops->map_mem_usage)
+               return ERR_PTR(-EINVAL);
        map = ops->map_alloc(attr);
        if (IS_ERR(map))
                return map;
@@ -775,13 +777,7 @@ static fmode_t map_get_sys_perms(struct bpf_map *map, struct fd f)
 /* Show the memory usage of a bpf map */
 static u64 bpf_map_memory_usage(const struct bpf_map *map)
 {
-       unsigned long size;
-
-       if (map->ops->map_mem_usage)
-               return map->ops->map_mem_usage(map);
-
-       size = round_up(map->key_size + bpf_map_value_size(map), 8);
-       return round_up(map->max_entries * size, PAGE_SIZE);
+       return map->ops->map_mem_usage(map);
 }
 
 static void bpf_map_show_fdinfo(struct seq_file *m, struct file *filp)