]> git.dujemihanovic.xyz Git - linux.git/commitdiff
rxrpc: Fix congestion control algorithm
authorDavid Howells <dhowells@redhat.com>
Fri, 3 May 2024 15:07:39 +0000 (16:07 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 May 2024 15:05:03 +0000 (08:05 -0700)
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>
net/rxrpc/ar-internal.h
net/rxrpc/call_object.c
net/rxrpc/input.c

index 08c0a32db8c746f095b64c19b54ba6b2c1c815b2..08de24658f4fa9679cb489f7f889d9824ca73479 100644 (file)
@@ -697,7 +697,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 01fa71e8b1f72c3c98fb6ca8657b8b8ab9e4b465..f9e983a12c1492261d87773b5a118431dafd406f 100644 (file)
@@ -174,12 +174,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 3dedb8c0618ca6c79075184b88dbe5e0078e7548..860075f1290b65457f9ebe46d5a24017675db668 100644 (file)
@@ -685,9 +685,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;