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: 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>pull/1354/merge
parent
8c868a34ea
commit
8f6ddc0587
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue