Skip to content

Commit

Permalink
rxrpc: Abstract out the calculation of whether there's Tx space
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
dhowells committed Mar 13, 2020
1 parent e1f550d commit 158fe66
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions net/rxrpc/sendmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,21 @@
#include <net/af_rxrpc.h>
#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.
*/
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 158fe66

Please sign in to comment.