The subsystems consuming struct_ops objects may need to detach or unregister 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. We offer a function for the subsystems to remove an object that was previously registered with them. The BPF struct_ops will detach the corresponding link if one exists and send an event through epoll. Additionally, we allow user space programs to disconnect a struct_ops map from the attached link. The user space programs could add an entry to an epoll file descriptor for the link that a struct_ops object has been attached to, and receive notifications when the object is detached from the link by user space programs or the subsystem consuming the object. However, bpf struct_ops maps without BPF_F_LINK are not supported here. Although, the subsystems still can unregister them through the function provided here, but the user space program doesn't get notified since they don't have links. Kui-Feng Lee (6): bpf: add a pointer of the attached link to bpf_struct_ops_map. bpf: export bpf_link_inc_not_zero(). bpf: provide a function to unregister struct_ops objects from consumers. bpf: detach a bpf_struct_ops_map from a link. bpf: support epoll from bpf struct_ops links. selftests/bpf: test detaching struct_ops links. include/linux/bpf.h | 9 + kernel/bpf/bpf_struct_ops.c | 186 +++++++++++++++++- kernel/bpf/syscall.c | 17 +- .../selftests/bpf/bpf_testmod/bpf_testmod.c | 18 +- .../selftests/bpf/bpf_testmod/bpf_testmod.h | 1 + .../bpf/prog_tests/test_struct_ops_module.c | 104 ++++++++++ .../selftests/bpf/progs/struct_ops_module.c | 7 + 7 files changed, 328 insertions(+), 14 deletions(-) -- 2.34.1