mbox series

[bpf-next,v7,0/8] Notify user space when a struct_ops object is detached/unregistered

Message ID 20240530065946.979330-1-thinker.li@gmail.com (mailing list archive)
Headers show
Series Notify user space when a struct_ops object is detached/unregistered | expand

Message

Thinker Li May 30, 2024, 6:59 a.m. UTC
From: Kui-Feng Lee <kuifeng@meta.com>

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 v6:

 - Fix the missing header at patch 5.

 - Move RCU_INIT_POINTER() back to its original position.

Changes from v5:

 - Change the commit title of the patch for bpftool.

Changes from v4:

 - Change error code for bpf_struct_ops_map_link_update()

 - Always return 0 for bpf_struct_ops_map_link_detach()

 - Hold update_mutex in bpf_struct_ops_link_create()

 - Add a separated instance of file_operations for links supporting
    poll.

 - Fix bpftool for bpf_link_fops_poll.

Changes from v3:

 - Add a comment to explain why holding update_mutex is not necessary
    in bpf_struct_ops_link_create()

 - Use rcu_access_pointer() in bpf_struct_ops_map_link_poll().

Changes from v2:

 - Rephrased commit logs and comments.

 - Addressed some mistakes from patch splitting.

 - Replace mutex with spinlock in bpf_testmod.c to address lockdep
    Splat and simplify the implementation.

 - Fix an argument passing to rcu_dereference_protected().

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 mimic 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.

v6: https://lore.kernel.org/bpf/20240524223036.318800-1-thinker.li@gmail.com/
v5: https://lore.kernel.org/all/20240523230848.2022072-1-thinker.li@gmail.com/
v4: https://lore.kernel.org/all/20240521225121.770930-1-thinker.li@gmail.com/
v3: https://lore.kernel.org/all/20240510002942.1253354-1-thinker.li@gmail.com/
v2: https://lore.kernel.org/all/20240507055600.2382627-1-thinker.li@gmail.com/
v1: https://lore.kernel.org/all/20240429213609.487820-1-thinker.li@gmail.com/


Kui-Feng Lee (8):
  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.
  bpf: export bpf_link_inc_not_zero.
  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.
  bpftool: Change pid_iter.bpf.c to comply with the change of
    bpf_link_fops.

 include/linux/bpf.h                           |  13 +-
 kernel/bpf/bpf_struct_ops.c                   |  72 ++++++--
 kernel/bpf/syscall.c                          |  34 +++-
 net/bpf/bpf_dummy_struct_ops.c                |   4 +-
 net/ipv4/bpf_tcp_ca.c                         |   6 +-
 tools/bpf/bpftool/skeleton/pid_iter.bpf.c     |   7 +-
 .../bpf/bpf_test_no_cfi/bpf_test_no_cfi.c     |   4 +-
 .../selftests/bpf/bpf_testmod/bpf_testmod.c   |  48 ++++-
 .../bpf/bpf_testmod/bpf_testmod_kfunc.h       |   1 +
 .../bpf/prog_tests/test_struct_ops_module.c   | 168 ++++++++++++++++++
 .../selftests/bpf/progs/struct_ops_detach.c   |  17 ++
 11 files changed, 344 insertions(+), 30 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/progs/struct_ops_detach.c

Comments

patchwork-bot+netdevbpf@kernel.org May 30, 2024, 10:40 p.m. UTC | #1
Hello:

This series was applied to bpf/bpf-next.git (master)
by Martin KaFai Lau <martin.lau@kernel.org>:

On Wed, 29 May 2024 23:59:38 -0700 you wrote:
> From: Kui-Feng Lee <kuifeng@meta.com>
> 
> 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.
> 
> [...]

Here is the summary with links:
  - [bpf-next,v7,1/8] bpf: pass bpf_struct_ops_link to callbacks in bpf_struct_ops.
    https://git.kernel.org/bpf/bpf-next/c/73287fe22872
  - [bpf-next,v7,2/8] bpf: enable detaching links of struct_ops objects.
    https://git.kernel.org/bpf/bpf-next/c/6fb2544ea149
  - [bpf-next,v7,3/8] bpf: support epoll from bpf struct_ops links.
    https://git.kernel.org/bpf/bpf-next/c/1adddc97aa44
  - [bpf-next,v7,4/8] bpf: export bpf_link_inc_not_zero.
    https://git.kernel.org/bpf/bpf-next/c/67c3e8353f45
  - [bpf-next,v7,5/8] selftests/bpf: test struct_ops with epoll
    https://git.kernel.org/bpf/bpf-next/c/1a4b858b6a04
  - [bpf-next,v7,6/8] selftests/bpf: detach a struct_ops link from the subsystem managing it.
    (no matching commit)
  - [bpf-next,v7,7/8] selftests/bpf: make sure bpf_testmod handling racing link destroying well.
    (no matching commit)
  - [bpf-next,v7,8/8] bpftool: Change pid_iter.bpf.c to comply with the change of bpf_link_fops.
    https://git.kernel.org/bpf/bpf-next/c/d14c1fac0c97

You are awesome, thank you!