On Sun, Apr 4, 2021 at 9:47 PM Yonghong Song <yhs@xxxxxx> wrote: > > > > On 3/29/21 5:57 AM, Denis Salopek wrote: > > Extend the existing bpf_map_lookup_and_delete_elem() functionality to > > hashtab maps, in addition to stacks and queues. > > Add bpf_map_lookup_and_delete_elem_flags() libbpf API in order to use > > the BPF_F_LOCK flag. > > Create a new hashtab bpf_map_ops function that does lookup and deletion > > of the element under the same bucket lock and add the created map_ops to > > bpf.h. > > Add the appropriate test cases to 'maps' and 'lru_map' selftests > > accompanied with new test_progs. > > > > Cc: Juraj Vijtiuk <juraj.vijtiuk@xxxxxxxxxx> > > Cc: Luka Oreskovic <luka.oreskovic@xxxxxxxxxx> > > Cc: Luka Perkov <luka.perkov@xxxxxxxxxx> > > Signed-off-by: Denis Salopek <denis.salopek@xxxxxxxxxx> > > --- > > v2: Add functionality for LRU/per-CPU, add test_progs tests. > > v3: Add bpf_map_lookup_and_delete_elem_flags() and enable BPF_F_LOCK > > flag, change CHECKs to ASSERT_OKs, initialize variables to 0. > > v4: Fix the return value for unsupported map types. > > --- > > include/linux/bpf.h | 2 + > > kernel/bpf/hashtab.c | 97 ++++++ > > kernel/bpf/syscall.c | 27 +- > > tools/lib/bpf/bpf.c | 13 + > > tools/lib/bpf/bpf.h | 2 + > > tools/lib/bpf/libbpf.map | 1 + > > .../bpf/prog_tests/lookup_and_delete.c | 279 ++++++++++++++++++ > > .../bpf/progs/test_lookup_and_delete.c | 26 ++ > > tools/testing/selftests/bpf/test_lru_map.c | 8 + > > tools/testing/selftests/bpf/test_maps.c | 19 +- > > 10 files changed, 469 insertions(+), 5 deletions(-) > > create mode 100644 tools/testing/selftests/bpf/prog_tests/lookup_and_delete.c > > create mode 100644 tools/testing/selftests/bpf/progs/test_lookup_and_delete.c > [...] > > +int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, void *value, __u64 flags) > > +{ > > + union bpf_attr attr; > > + > > + memset(&attr, 0, sizeof(attr)); > > + attr.map_fd = fd; > > + attr.key = ptr_to_u64(key); > > + attr.value = ptr_to_u64(value); > > + attr.flags = flags; > > + > > + return sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, sizeof(attr)); > > +} > > This looks okay to me. It mimics bpf_map_lookup_elem_flags(). > Andrii, could you take a look as well? I think it's fine. Given bpf_map_lookup_elem_flags() didn't get extended for so long means the API is pretty stable and is unlikely to require the entire OPTS framework. > > > + > > int bpf_map_delete_elem(int fd, const void *key) > > { > > union bpf_attr attr; [...]