On Wed, Aug 27, 2025 at 9:45 AM Leon Hwang <leon.hwang@xxxxxxxxx> wrote: > > It is to unify map flags checking for lookup_elem, update_elem, > lookup_batch and update_batch APIs. > > Therefore, it will be convenient to check BPF_F_CPU and BPF_F_ALL_CPUS > flags in it for these APIs in next patch. > > Signed-off-by: Leon Hwang <leon.hwang@xxxxxxxxx> > --- > include/linux/bpf.h | 28 ++++++++++++++++++++++++++++ > kernel/bpf/syscall.c | 34 +++++++++++----------------------- > 2 files changed, 39 insertions(+), 23 deletions(-) > > diff --git a/include/linux/bpf.h b/include/linux/bpf.h > index 8f6e87f0f3a89..512717d442c09 100644 > --- a/include/linux/bpf.h > +++ b/include/linux/bpf.h > @@ -3709,4 +3709,32 @@ int bpf_prog_get_file_line(struct bpf_prog *prog, unsigned long ip, const char * > const char **linep, int *nump); > struct bpf_prog *bpf_prog_find_from_stack(void); > > +static inline int bpf_map_check_op_flags(struct bpf_map *map, u64 flags, u64 extra_flags_mask) > +{ > + if (extra_flags_mask && (flags & extra_flags_mask)) doh, Leon... when extra_flags_mask == 0, `flags & extra_flags_mask` is always false, so just: if (flags & extra_flags_mask) return -EINVAL; But it feels more natural to reverse the meaning of this and treat it as extra *allowed flags*. So zero would mean no extra flags should be there (most strict case) and ~0 would mean "we don't care or will check later". And so in the code you'd have if (flags & ~extra_flags) /* check for any unsupported flags */ return -EINVAL; But I need someone else to do a reality check on me here at this point. > + return -EINVAL; > + > + if ((flags & BPF_F_LOCK) && !btf_record_has_field(map->record, BPF_SPIN_LOCK)) > + return -EINVAL; > + > + return 0; > +} > + > +static inline int bpf_map_check_update_flags(struct bpf_map *map, u64 flags) > +{ > + return bpf_map_check_op_flags(map, flags, 0); > +} > + > +#define BPF_MAP_LOOKUP_ELEM_EXTRA_FLAGS_MASK (~BPF_F_LOCK) > + > +static inline int bpf_map_check_lookup_flags(struct bpf_map *map, u64 flags) > +{ > + return bpf_map_check_op_flags(map, flags, BPF_MAP_LOOKUP_ELEM_EXTRA_FLAGS_MASK); > +} > + > +static inline int bpf_map_check_batch_flags(struct bpf_map *map, u64 flags) > +{ > + return bpf_map_check_op_flags(map, flags, BPF_MAP_LOOKUP_ELEM_EXTRA_FLAGS_MASK); > +} > + > #endif /* _LINUX_BPF_H */ [...]