[PATCH bpf-next v2 00/15] bpf: A common way to attach struct_ops to a cgroup
From: Amery Hung <hidden>
Date: 2026-06-23 17:50:09
Also in:
bpf
Hi, I am continuing Martin's work to support attaching struct_ops to cgroup. At LSF/MM/BPF 2025, Martin presented [1] the need for a new interface to extend tcp_sock operations instead of adding more BPF_SOCK_OPS_*CB enum values. The need for predictable ordering when attaching struct_ops to a cgroup was also briefly discussed. At LSF/MM/BPF 2026, additional use cases were raised, in particular OOM and memcg use cases that also need to attach struct_ops to a cgroup. BPF already has a common bpf_link-based API for attaching different BPF program types to a cgroup. It provides common attach, detach, update, ordering, and query semantics across those program types. This series extends the same model to struct_ops. Conceptually, struct_ops is a group of BPF programs, so using similar attachment/detachment/update/query APIs and ordering semantics for cgroup attachment keeps the interface consistent with existing cgroup BPF links. This series uses a new struct bpf_tcp_ops as the first user. The struct_ops mirrors the TCP-related sockops hooks except BPF_SOCK_OPS_NEEDS_ECN and BPF_SOCK_OPS_BASE_RTT, which are intentionally left out. The selftests cover attach, query, update, ordering, before/after placement, retval chaining, the header option hooks, and inheritance across a multi-level cgroup hierarchy. The map_free_pre_rcu addition in patch 2 is not very ideal; it will need some thought too. [1] page 13: https://drive.google.com/file/d/1wjKZth6T0llLJ_ONPAL_6Q_jbxbAjByp/view?usp=sharing Changelog RFC v1 -> v2 - Fix UAF of cfi_stubs - Fix retval: use bpf_tramp_run_ctx instead of bpf_cg_run_ctx and expose bpf_get_retval() to bpf_tcp_ops - Add selftests - struct_ops cgroup attachment - Test bpf_get_retval() - Test before/after order - Test cgroup hierarchy and inheritance - Test TCP header option hooks and helpers - Move bpf_tcp_ops out of legacy BPF_SOCK_OPS_TEST_FLAG guard - Complete bpf_tcp_ops (make it comparable to legacy sockops tcp) --- Amery Hung (4): bpf: Allow all struct_ops to use bpf_dynptr_from_skb() bpf: tcp: Support selected sock_ops callbacks as struct_ops bpf: tcp: Support parse/len/write header option hooks in bpf_tcp_ops selftests/bpf: Add test for bpf_tcp_ops header option hooks Martin KaFai Lau (11): bpf: Remove __rcu tagging in st_link->map bpf: Make struct_ops tasks_rcu grace period optional bpf: Add bpf_struct_ops accessor helpers bpf: Remove unnecessary prog_list_prog() check bpf: Replace prog_list_prog() check with direct pl->prog and pl->link check bpf: Add prog_list_init_item(), prog_list_replace_item(), and prog_list_id() bpf: Move LSM trampoline unlink into bpf_cgroup_link_auto_detach() bpf: Add a few bpf_cgroup_array_* helper functions bpf: Add infrastructure to support attaching struct_ops to cgroups libbpf: Support attaching struct_ops to a cgroup selftests/bpf: Test attaching struct_ops to a cgroup include/linux/bpf-cgroup-defs.h | 1 + include/linux/bpf-cgroup.h | 28 + include/linux/bpf.h | 56 +- include/linux/filter.h | 5 + include/net/tcp.h | 153 ++++- include/uapi/linux/bpf.h | 39 +- kernel/bpf/bpf_struct_ops.c | 152 +++-- kernel/bpf/btf.c | 23 +- kernel/bpf/cgroup.c | 472 ++++++++++++++- kernel/bpf/core.c | 5 + kernel/bpf/syscall.c | 4 + net/core/filter.c | 33 +- net/ipv4/Makefile | 1 + net/ipv4/af_inet.c | 1 + net/ipv4/bpf_tcp_ca.c | 16 + net/ipv4/bpf_tcp_ops.c | 310 ++++++++++ net/ipv4/tcp.c | 1 + net/ipv4/tcp_input.c | 17 + net/ipv4/tcp_output.c | 48 ++ net/ipv4/tcp_timer.c | 1 + net/sched/bpf_qdisc.c | 2 - tools/include/uapi/linux/bpf.h | 39 +- tools/lib/bpf/bpf.c | 2 + tools/lib/bpf/bpf.h | 3 +- tools/lib/bpf/libbpf.c | 59 ++ tools/lib/bpf/libbpf.h | 3 + tools/lib/bpf/libbpf.map | 5 + tools/lib/bpf/libbpf_version.h | 2 +- .../selftests/bpf/prog_tests/bpf_tcp_ops.c | 554 ++++++++++++++++++ .../bpf/prog_tests/bpf_tcp_ops_hdr.c | 97 +++ .../testing/selftests/bpf/progs/bpf_tcp_ops.c | 141 +++++ .../selftests/bpf/progs/bpf_tcp_ops_hdr.c | 83 +++ 32 files changed, 2234 insertions(+), 122 deletions(-) create mode 100644 net/ipv4/bpf_tcp_ops.c create mode 100644 tools/testing/selftests/bpf/prog_tests/bpf_tcp_ops.c create mode 100644 tools/testing/selftests/bpf/prog_tests/bpf_tcp_ops_hdr.c create mode 100644 tools/testing/selftests/bpf/progs/bpf_tcp_ops.c create mode 100644 tools/testing/selftests/bpf/progs/bpf_tcp_ops_hdr.c -- 2.53.0-Meta