rxrpc: Abstract out the calculation of whether there's Tx space
authorDavid Howells <dhowells@redhat.com>
Fri, 13 Mar 2020 09:05:38 +0000 (09:05 +0000)
committerDavid Howells <dhowells@redhat.com>
Fri, 13 Mar 2020 23:04:28 +0000 (23:04 +0000)
Abstract out the calculation of there being sufficient Tx buffer space.
This is reproduced several times in the rxrpc sendmsg code.

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/sendmsg.c

index 813fd68..a13051d 100644 (file)
 #include "ar-internal.h"
 
 /*
+ * Return true if there's sufficient Tx queue space.
+ */
+static bool rxrpc_check_tx_space(struct rxrpc_call *call, rxrpc_seq_t *_tx_win)
+{
+       unsigned int win_size =
+               min_t(unsigned int, call->tx_winsize,
+                     call->cong_cwnd + call->cong_extra);
+       rxrpc_seq_t tx_win = READ_ONCE(call->tx_hard_ack);
+
+       if (_tx_win)
+               *_tx_win = tx_win;
+       return call->tx_top - tx_win < win_size;
+}
+
+/*
  * Wait for space to appear in the Tx queue or a signal to occur.
  */
 static int rxrpc_wait_for_tx_window_intr(struct rxrpc_sock *rx,
@@ -26,9 +41,7 @@ static int rxrpc_wait_for_tx_window_intr(struct rxrpc_sock *rx,
 {
        for (;;) {
                set_current_state(TASK_INTERRUPTIBLE);
-               if (call->tx_top - call->tx_hard_ack <
-                   min_t(unsigned int, call->tx_winsize,
-                         call->cong_cwnd + call->cong_extra))
+               if (rxrpc_check_tx_space(call, NULL))
                        return 0;
 
                if (call->state >= RXRPC_CALL_COMPLETE)
@@ -68,9 +81,7 @@ static int rxrpc_wait_for_tx_window_nonintr(struct rxrpc_sock *rx,
                set_current_state(TASK_UNINTERRUPTIBLE);
 
                tx_win = READ_ONCE(call->tx_hard_ack);
-               if (call->tx_top - tx_win <
-                   min_t(unsigned int, call->tx_winsize,
-                         call->cong_cwnd + call->cong_extra))
+               if (rxrpc_check_tx_space(call, &tx_win))
                        return 0;
 
                if (call->state >= RXRPC_CALL_COMPLETE)
@@ -302,9 +313,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
 
                        _debug("alloc");
 
-                       if (call->tx_top - call->tx_hard_ack >=
-                           min_t(unsigned int, call->tx_winsize,
-                                 call->cong_cwnd + call->cong_extra)) {
+                       if (!rxrpc_check_tx_space(call, NULL)) {
                                ret = -EAGAIN;
                                if (msg->msg_flags & MSG_DONTWAIT)
                                        goto maybe_error;