Commit 8f6ddc05 authored by Leon Hwang's avatar Leon Hwang Committed by Alexei Starovoitov
Browse files

bpf: Introduce internal bpf_map_check_op_flags helper function



It is to unify map flags checking for lookup_elem, update_elem,
lookup_batch and update_batch APIs.

Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarLeon Hwang <leon.hwang@linux.dev>
Link: https://lore.kernel.org/r/20251125145857.98134-2-leon.hwang@linux.dev


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 8c868a34
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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 */
+11 −23
Original line number Diff line number Diff line
@@ -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);