]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Introduce internal bpf_map_check_op_flags helper function
authorLeon Hwang <leon.hwang@linux.dev>
Tue, 25 Nov 2025 14:58:50 +0000 (22:58 +0800)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 25 Nov 2025 23:27:48 +0000 (15:27 -0800)
It is to unify map flags checking for lookup_elem, update_elem,
lookup_batch and update_batch APIs.

Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
Link: https://lore.kernel.org/r/20251125145857.98134-2-leon.hwang@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf.h
kernel/bpf/syscall.c

index a9b788c7b4aa42d93b361b859d1197445de931c0..6498be4c44f8c27534bad235c035a170d1fb40d4 100644 (file)
@@ -3829,4 +3829,15 @@ bpf_prog_update_insn_ptrs(struct bpf_prog *prog, u32 *offsets, void *image)
 }
 #endif
 
+static inline int bpf_map_check_op_flags(struct bpf_map *map, u64 flags, u64 allowed_flags)
+{
+       if (flags & ~allowed_flags)
+               return -EINVAL;
+
+       if ((flags & BPF_F_LOCK) && !btf_record_has_field(map->record, BPF_SPIN_LOCK))
+               return -EINVAL;
+
+       return 0;
+}
+
 #endif /* _LINUX_BPF_H */
index 792623a7c90b529183f49c93900ba26af3152045..cef8963d69f98a34d8636245bf4fd26da02766da 100644 (file)
@@ -1725,9 +1725,6 @@ static int map_lookup_elem(union bpf_attr *attr)
        if (CHECK_ATTR(BPF_MAP_LOOKUP_ELEM))
                return -EINVAL;
 
-       if (attr->flags & ~BPF_F_LOCK)
-               return -EINVAL;
-
        CLASS(fd, f)(attr->map_fd);
        map = __bpf_map_get(f);
        if (IS_ERR(map))
@@ -1735,9 +1732,9 @@ static int map_lookup_elem(union bpf_attr *attr)
        if (!(map_get_sys_perms(map, f) & FMODE_CAN_READ))
                return -EPERM;
 
-       if ((attr->flags & BPF_F_LOCK) &&
-           !btf_record_has_field(map->record, BPF_SPIN_LOCK))
-               return -EINVAL;
+       err = bpf_map_check_op_flags(map, attr->flags, BPF_F_LOCK);
+       if (err)
+               return err;
 
        key = __bpf_copy_key(ukey, map->key_size);
        if (IS_ERR(key))
@@ -1800,11 +1797,9 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
                goto err_put;
        }
 
-       if ((attr->flags & BPF_F_LOCK) &&
-           !btf_record_has_field(map->record, BPF_SPIN_LOCK)) {
-               err = -EINVAL;
+       err = bpf_map_check_op_flags(map, attr->flags, ~0);
+       if (err)
                goto err_put;
-       }
 
        key = ___bpf_copy_key(ukey, map->key_size);
        if (IS_ERR(key)) {
@@ -2008,13 +2003,9 @@ int generic_map_update_batch(struct bpf_map *map, struct file *map_file,
        void *key, *value;
        int err = 0;
 
-       if (attr->batch.elem_flags & ~BPF_F_LOCK)
-               return -EINVAL;
-
-       if ((attr->batch.elem_flags & BPF_F_LOCK) &&
-           !btf_record_has_field(map->record, BPF_SPIN_LOCK)) {
-               return -EINVAL;
-       }
+       err = bpf_map_check_op_flags(map, attr->batch.elem_flags, BPF_F_LOCK);
+       if (err)
+               return err;
 
        value_size = bpf_map_value_size(map);
 
@@ -2071,12 +2062,9 @@ int generic_map_lookup_batch(struct bpf_map *map,
        u32 value_size, cp, max_count;
        int err;
 
-       if (attr->batch.elem_flags & ~BPF_F_LOCK)
-               return -EINVAL;
-
-       if ((attr->batch.elem_flags & BPF_F_LOCK) &&
-           !btf_record_has_field(map->record, BPF_SPIN_LOCK))
-               return -EINVAL;
+       err = bpf_map_check_op_flags(map, attr->batch.elem_flags, BPF_F_LOCK);
+       if (err)
+               return err;
 
        value_size = bpf_map_value_size(map);