We're currently building a control plane for our BPF socket dispatch work. As part of that, we have a need to create a copy of an existing sockhash, to allow us to change the keys. I previously proposed allowing privileged userspace to look up sockets, which doesn't work due to security concerns (see [1]). In follow up discussions during BPF office hours we identified bpf_iter as a possible solution: instead of accessing sockets from user space we can iterate the source sockhash, and insert the values into a new map. Enabling this requires two pieces: the ability to iterate sockmap and sockhash, as well as being able to call map_update_elem from BPF. This patch set implements the latter: it's now possible to update sockmap from BPF context. As a next step, we can implement bpf_iter for sockmap. The patches are organised as follows: * Patches 1-3 are cleanups and simplifications, to make reasoning about the subsequent patches easier. * Patch 4 makes map_update_elem return a PTR_TO_SOCKET_OR_NULL for sockmap / sockhash lookups. * Patch 5 enables map_update_elem from BPF. There is some locking here that I'm not entirely sure about. Feedback much appreciated. * Patch 6 adds a selftest. 1: https://lore.kernel.org/bpf/20200310174711.7490-1-lmb@xxxxxxxxxxxxxx/ Lorenz Bauer (6): net: sk_msg: simplify sk_psock initialization bpf: sockmap: merge sockmap and sockhash update functions bpf: sockmap: call sock_map_update_elem directly bpf: override the meaning of ARG_PTR_TO_MAP_VALUE for sockmap and sockhash bpf: sockmap: allow update from BPF selftests: bpf: test sockmap update from BPF include/linux/bpf.h | 7 + include/linux/skmsg.h | 17 --- kernel/bpf/syscall.c | 5 +- kernel/bpf/verifier.c | 46 +++++- net/core/skmsg.c | 34 ++++- net/core/sock_map.c | 137 ++++++++---------- net/ipv4/tcp_bpf.c | 13 +- net/ipv4/udp_bpf.c | 9 +- .../selftests/bpf/prog_tests/sockmap_basic.c | 76 ++++++++++ .../selftests/bpf/progs/test_sockmap_copy.c | 48 ++++++ 10 files changed, 274 insertions(+), 118 deletions(-) create mode 100644 tools/testing/selftests/bpf/progs/test_sockmap_copy.c -- 2.25.1