The subsystems managing struct_ops objects may need to detach a struct_ops object due to errors or other reasons. It would be useful to notify user space programs so that error recovery or logging can be carried out. This patch set enables the detach feature for struct_ops links and send an event to epoll when a link is detached. Subsystems could call link->ops->detach() to detach a link and notify user space programs through epoll. The signatures of callback functions in "struct bpf_struct_ops" have been changed as well to pass an extra link argument to subsystems. Subsystems could detach the links received from reg() and update() callbacks if there is. This also provides a way that subsystems can distinguish registrations for an object that has been registered multiple times for several links. However, bpf struct_ops maps without BPF_F_LINK have no any link. Subsystems will receive NULL link pointer for this case. --- Changes from v1: - Pass a link to reg, unreg, and update callbacks. - Provide a function to detach a link from underlying subsystems. - Add a kfunc to minic detachments from subsystems, and provide a flexible way to control when to do detachments. - Add two tests to detach a link from the subsystem after the refcount of the link drops to zero. v1: https://lore.kernel.org/all/20240429213609.487820-1-thinker.li@xxxxxxxxx/ Kui-Feng Lee (6): bpf: pass bpf_struct_ops_link to callbacks in bpf_struct_ops. bpf: enable detaching links of struct_ops objects. bpf: support epoll from bpf struct_ops links. selftests/bpf: test struct_ops with epoll selftests/bpf: detach a struct_ops link from the subsystem managing it. selftests/bpf: make sure bpf_testmod handling racing link destroying well. include/linux/bpf.h | 7 +- kernel/bpf/bpf_struct_ops.c | 77 ++++++-- kernel/bpf/syscall.c | 11 ++ net/bpf/bpf_dummy_struct_ops.c | 4 +- net/ipv4/bpf_tcp_ca.c | 6 +- .../bpf/bpf_test_no_cfi/bpf_test_no_cfi.c | 4 +- .../selftests/bpf/bpf_testmod/bpf_testmod.c | 40 ++++- .../bpf/bpf_testmod/bpf_testmod_kfunc.h | 1 + .../bpf/prog_tests/test_struct_ops_module.c | 166 ++++++++++++++++++ .../selftests/bpf/progs/struct_ops_detach.c | 37 ++++ 10 files changed, 329 insertions(+), 24 deletions(-) create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_detach.c -- 2.34.1