Message ID | 20231001151239.1866845-1-ncardwell.sw@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 059217c18be6757b95bfd77ba53fb50b48b8a816 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v2,net,1/2] tcp: fix quick-ack counting to count actual ACKs of new data | expand |
Hello: This series was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Sun, 1 Oct 2023 11:12:38 -0400 you wrote: > From: Neal Cardwell <ncardwell@google.com> > > This commit fixes quick-ack counting so that it only considers that a > quick-ack has been provided if we are sending an ACK that newly > acknowledges data. > > The code was erroneously using the number of data segments in outgoing > skbs when deciding how many quick-ack credits to remove. This logic > does not make sense, and could cause poor performance in > request-response workloads, like RPC traffic, where requests or > responses can be multi-segment skbs. > > [...] Here is the summary with links: - [v2,net,1/2] tcp: fix quick-ack counting to count actual ACKs of new data https://git.kernel.org/netdev/net/c/059217c18be6 - [v2,net,2/2] tcp: fix delayed ACKs for MSS boundary condition https://git.kernel.org/netdev/net/c/4720852ed9af You are awesome, thank you!
diff --git a/include/net/tcp.h b/include/net/tcp.h index 91688d0dadcd6..7b1a720691aec 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -348,12 +348,14 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos, struct sk_buff *tcp_stream_alloc_skb(struct sock *sk, gfp_t gfp, bool force_schedule); -static inline void tcp_dec_quickack_mode(struct sock *sk, - const unsigned int pkts) +static inline void tcp_dec_quickack_mode(struct sock *sk) { struct inet_connection_sock *icsk = inet_csk(sk); if (icsk->icsk_ack.quick) { + /* How many ACKs S/ACKing new data have we sent? */ + const unsigned int pkts = inet_csk_ack_scheduled(sk) ? 1 : 0; + if (pkts >= icsk->icsk_ack.quick) { icsk->icsk_ack.quick = 0; /* Leaving quickack mode we deflate ATO. */ diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index ccfc8bbf74558..aa0fc8c766e50 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -177,8 +177,7 @@ static void tcp_event_data_sent(struct tcp_sock *tp, } /* Account for an ACK we sent. */ -static inline void tcp_event_ack_sent(struct sock *sk, unsigned int pkts, - u32 rcv_nxt) +static inline void tcp_event_ack_sent(struct sock *sk, u32 rcv_nxt) { struct tcp_sock *tp = tcp_sk(sk); @@ -192,7 +191,7 @@ static inline void tcp_event_ack_sent(struct sock *sk, unsigned int pkts, if (unlikely(rcv_nxt != tp->rcv_nxt)) return; /* Special ACK sent by DCTCP to reflect ECN */ - tcp_dec_quickack_mode(sk, pkts); + tcp_dec_quickack_mode(sk); inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK); } @@ -1387,7 +1386,7 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, sk, skb); if (likely(tcb->tcp_flags & TCPHDR_ACK)) - tcp_event_ack_sent(sk, tcp_skb_pcount(skb), rcv_nxt); + tcp_event_ack_sent(sk, rcv_nxt); if (skb->len != tcp_header_size) { tcp_event_data_sent(tp, sk);