Message ID | 20240501074338.362361-1-miaxu@meta.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,v2,1/3] Add new args for cong_control in tcp_congestion_ops | expand |
On Wed, 1 May 2024 00:43:36 -0700 Miao Xu wrote: > This patch adds two new arguments for cong_control of struct > tcp_congestion_ops: > - ack > - flag > These two arguments are inherited from the caller tcp_cong_control in > tcp_intput.c. One use case of them is to update cwnd and pacing rate > inside cong_control based on the info they provide. For example, the > flag can be used to decide if it is the right time to raise or reduce a > sender's cwnd. > > Reviewed-by: Eric Dumazet <edumazet@google.com> > -- three dashes here --- > Changes in v2: > * Split the v1 patch into 2 separate patches. In particular, spin out > bpf_tcp_ca.c as a separate patch because it is bpf specific. > > Signed-off-by: Miao Xu <miaxu@meta.com> This goes after Eric's review tag. Looks like you need to adjust one of the BPF selftests: Error: #29/14 bpf_tcp_ca/tcp_ca_kfunc Error: #29/14 bpf_tcp_ca/tcp_ca_kfunc libbpf: extern (func ksym) 'bbr_main': func_proto [213] incompatible with vmlinux [48152] libbpf: failed to load object 'tcp_ca_kfunc' libbpf: failed to load BPF skeleton 'tcp_ca_kfunc': -22 test_tcp_ca_kfunc:FAIL:tcp_ca_kfunc__open_and_load unexpected error: -22
diff --git a/include/net/tcp.h b/include/net/tcp.h index fe98fb01879b..7294da8fb780 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1172,7 +1172,7 @@ struct tcp_congestion_ops { /* call when packets are delivered to update cwnd and pacing rate, * after all the ca_state processing. (optional) */ - void (*cong_control)(struct sock *sk, const struct rate_sample *rs); + void (*cong_control)(struct sock *sk, u32 ack, int flag, const struct rate_sample *rs); /* new value of cwnd after loss (required) */ diff --git a/net/ipv4/bpf_tcp_ca.c b/net/ipv4/bpf_tcp_ca.c index 7f518ea5f4ac..6bd7f8db189a 100644 --- a/net/ipv4/bpf_tcp_ca.c +++ b/net/ipv4/bpf_tcp_ca.c @@ -307,7 +307,8 @@ static u32 bpf_tcp_ca_min_tso_segs(struct sock *sk) return 0; } -static void bpf_tcp_ca_cong_control(struct sock *sk, const struct rate_sample *rs) +static void bpf_tcp_ca_cong_control(struct sock *sk, u32 ack, int flag, + const struct rate_sample *rs) { } diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c index 7e52ab24e40a..760941e55153 100644 --- a/net/ipv4/tcp_bbr.c +++ b/net/ipv4/tcp_bbr.c @@ -1024,7 +1024,7 @@ static void bbr_update_model(struct sock *sk, const struct rate_sample *rs) bbr_update_gains(sk); } -__bpf_kfunc static void bbr_main(struct sock *sk, const struct rate_sample *rs) +__bpf_kfunc static void bbr_main(struct sock *sk, u32 ack, int flag, const struct rate_sample *rs) { struct bbr *bbr = inet_csk_ca(sk); u32 bw; diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 53e1150f706f..23ccfc7b1d3c 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -3541,7 +3541,7 @@ static void tcp_cong_control(struct sock *sk, u32 ack, u32 acked_sacked, const struct inet_connection_sock *icsk = inet_csk(sk); if (icsk->icsk_ca_ops->cong_control) { - icsk->icsk_ca_ops->cong_control(sk, rs); + icsk->icsk_ca_ops->cong_control(sk, ack, flag, rs); return; }