]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rxrpc: Fix congestion control algorithm
authorDavid Howells <dhowells@redhat.com>
Fri, 3 May 2024 15:07:39 +0000 (16:07 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2024 10:02:23 +0000 (12:02 +0200)
[ Upstream commit ba4e103848d3a2a28a0445e39f4a9564187efe54 ]

Make the following fixes to the congestion control algorithm:

 (1) Don't vary the cwnd starting value by the size of RXRPC_TX_SMSS since
     that's currently held constant - set to the size of a jumbo subpacket
     payload so that we can create jumbo packets on the fly.  The current
     code invariably picks 3 as the starting value.

     Further, the starting cwnd needs to be an even number because we ack
     every other packet, so set it to 4.

 (2) Don't cut ssthresh when we see an ACK come from the peer with a
     receive window (rwind) less than ssthresh.  ssthresh keeps track of
     characteristics of the connection whereas rwind may be reduced by the
     peer for any reason - and may be reduced to 0.

Fixes: 1fc4fa2ac93d ("rxrpc: Fix congestion management")
Fixes: 0851115090a3 ("rxrpc: Reduce ssthresh to peer's receive window")
Signed-off-by: David Howells <dhowells@redhat.com>
Suggested-by: Simon Wilkinson <sxw@auristor.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Reviewed-by: Jeffrey Altman <jaltman@auristor.com <mailto:jaltman@auristor.com>>
Link: https://lore.kernel.org/r/20240503150749.1001323-2-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/rxrpc/ar-internal.h
net/rxrpc/call_object.c
net/rxrpc/input.c

index bda3f6690b32171ce511dc3591b2850c99e94869..d431376bb120ab11ee7c66f3ac6c0450ba9eb3ed 100644 (file)
@@ -688,7 +688,7 @@ struct rxrpc_call {
         * packets) rather than bytes.
         */
 #define RXRPC_TX_SMSS          RXRPC_JUMBO_DATALEN
-#define RXRPC_MIN_CWND         (RXRPC_TX_SMSS > 2190 ? 2 : RXRPC_TX_SMSS > 1095 ? 3 : 4)
+#define RXRPC_MIN_CWND         4
        u8                      cong_cwnd;      /* Congestion window size */
        u8                      cong_extra;     /* Extra to send for congestion management */
        u8                      cong_ssthresh;  /* Slow-start threshold */
index 0a50341d920af3508f661168720f85bd6c7bcc4f..29385908099efc4eb0a1c0ff02877b646f0a4d13 100644 (file)
@@ -175,12 +175,7 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp,
        call->rx_winsize = rxrpc_rx_window_size;
        call->tx_winsize = 16;
 
-       if (RXRPC_TX_SMSS > 2190)
-               call->cong_cwnd = 2;
-       else if (RXRPC_TX_SMSS > 1095)
-               call->cong_cwnd = 3;
-       else
-               call->cong_cwnd = 4;
+       call->cong_cwnd = RXRPC_MIN_CWND;
        call->cong_ssthresh = RXRPC_TX_MAX_WINDOW;
 
        call->rxnet = rxnet;
index 718ffd184ddb611deb06a8de2f7dbe9d1fbb0f95..f7304e06aadcacf67653d9688a621e8ba061876d 100644 (file)
@@ -688,9 +688,6 @@ static void rxrpc_input_ack_trailer(struct rxrpc_call *call, struct sk_buff *skb
                call->tx_winsize = rwind;
        }
 
-       if (call->cong_ssthresh > rwind)
-               call->cong_ssthresh = rwind;
-
        mtu = min(ntohl(trailer->maxMTU), ntohl(trailer->ifMTU));
 
        peer = call->peer;