From: Martin KaFai Lau <martin.lau@xxxxxxxxxx> The struct_ops is sharing the tracing-trampoline's enter/exit function which tracks prog->active to avoid recursion. It turns out the struct_ops bpf prog will hit this prog->active and unnecessarily skipped running the struct_ops prog. eg. The '.ssthresh' may run in_task() and then interrupted by softirq that runs the same '.ssthresh'. The kernel does not call the tcp-cc's ops in a recursive way, so this set is to remove the recursion check for struct_ops prog. v3: - Clear the bpf_chg_cc_inprogress from the newly cloned tcp_sock in tcp_create_openreq_child() because the listen sk can be cloned without lock being held. (Eric Dumazet) v2: - v1 [0] turned into a long discussion on a few cases and also whether it needs to follow the bpf_run_ctx chain if there is tracing bpf_run_ctx (kprobe/trace/trampoline) running in between. It is a good signal that it is not obvious enough to reason about it and needs a tradeoff for a more straight forward approach. This revision uses one bit out of an existing 1 byte hole in the tcp_sock. It is in Patch 4. [0]: https://lore.kernel.org/bpf/20220922225616.3054840-1-kafai@xxxxxx/T/#md98d40ac5ec295fdadef476c227a3401b2b6b911 Martin KaFai Lau (5): bpf: Add __bpf_prog_{enter,exit}_struct_ops for struct_ops trampoline bpf: Move the "cdg" tcp-cc check to the common sol_tcp_sockopt() bpf: Refactor bpf_setsockopt(TCP_CONGESTION) handling into another function bpf: tcp: Stop bpf_setsockopt(TCP_CONGESTION) in init ops to recur itself selftests/bpf: Check -EBUSY for the recurred bpf_setsockopt(TCP_CONGESTION) arch/x86/net/bpf_jit_comp.c | 3 + include/linux/bpf.h | 4 ++ include/linux/tcp.h | 6 ++ kernel/bpf/trampoline.c | 23 ++++++ net/core/filter.c | 70 ++++++++++++++----- net/ipv4/tcp_minisocks.c | 1 + .../selftests/bpf/prog_tests/bpf_tcp_ca.c | 4 ++ tools/testing/selftests/bpf/progs/bpf_dctcp.c | 25 ++++--- 8 files changed, 112 insertions(+), 24 deletions(-) -- 2.30.2