]> www.infradead.org Git - nvme.git/commitdiff
bpf, devmap: Add .map_alloc_check
authorFlorian Lehner <dev@der-flo.net>
Sat, 15 Jun 2024 10:11:58 +0000 (12:11 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 2 Jul 2024 17:05:25 +0000 (19:05 +0200)
Use the .map_allock_check callback to perform allocation checks before
allocating memory for the devmap.

Signed-off-by: Florian Lehner <dev@der-flo.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20240615101158.57889-1-dev@der-flo.net
kernel/bpf/devmap.c

index 7f3b34452243c83b6e113b5a5d831fc088854f54..da1fec906b96db71a7508ac1734aa7898cef968a 100644 (file)
@@ -107,7 +107,7 @@ static inline struct hlist_head *dev_map_index_hash(struct bpf_dtab *dtab,
        return &dtab->dev_index_head[idx & (dtab->n_buckets - 1)];
 }
 
-static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
+static int dev_map_alloc_check(union bpf_attr *attr)
 {
        u32 valsize = attr->value_size;
 
@@ -121,23 +121,28 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
            attr->map_flags & ~DEV_CREATE_FLAG_MASK)
                return -EINVAL;
 
+       if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) {
+               /* Hash table size must be power of 2; roundup_pow_of_two()
+                * can overflow into UB on 32-bit arches
+                */
+               if (attr->max_entries > 1UL << 31)
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
+{
        /* Lookup returns a pointer straight to dev->ifindex, so make sure the
         * verifier prevents writes from the BPF side
         */
        attr->map_flags |= BPF_F_RDONLY_PROG;
-
-
        bpf_map_init_from_attr(&dtab->map, attr);
 
        if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) {
-               /* hash table size must be power of 2; roundup_pow_of_two() can
-                * overflow into UB on 32-bit arches, so check that first
-                */
-               if (dtab->map.max_entries > 1UL << 31)
-                       return -EINVAL;
-
+               /* Hash table size must be power of 2 */
                dtab->n_buckets = roundup_pow_of_two(dtab->map.max_entries);
-
                dtab->dev_index_head = dev_map_create_hash(dtab->n_buckets,
                                                           dtab->map.numa_node);
                if (!dtab->dev_index_head)
@@ -1040,6 +1045,7 @@ static u64 dev_map_mem_usage(const struct bpf_map *map)
 BTF_ID_LIST_SINGLE(dev_map_btf_ids, struct, bpf_dtab)
 const struct bpf_map_ops dev_map_ops = {
        .map_meta_equal = bpf_map_meta_equal,
+       .map_alloc_check = dev_map_alloc_check,
        .map_alloc = dev_map_alloc,
        .map_free = dev_map_free,
        .map_get_next_key = dev_map_get_next_key,
@@ -1054,6 +1060,7 @@ const struct bpf_map_ops dev_map_ops = {
 
 const struct bpf_map_ops dev_map_hash_ops = {
        .map_meta_equal = bpf_map_meta_equal,
+       .map_alloc_check = dev_map_alloc_check,
        .map_alloc = dev_map_alloc,
        .map_free = dev_map_free,
        .map_get_next_key = dev_map_hash_get_next_key,