afs: Transmit more acks during processing to prevent stalls
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index 062ca9d..0430d2f 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h
@@ -602,9 +602,9 @@ struct rxrpc_call { * In the Tx phase, packets are annotated with which buffers have been * acked. */ -#define RXRPC_RXTX_BUFF_SIZE 64 +#define RXRPC_RXTX_BUFF_SIZE 128 #define RXRPC_RXTX_BUFF_MASK (RXRPC_RXTX_BUFF_SIZE - 1) -#define RXRPC_INIT_RX_WINDOW_SIZE 63 +#define RXRPC_INIT_RX_WINDOW_SIZE 127 struct sk_buff **rxtx_buffer; u8 *rxtx_annotations; #define RXRPC_TX_ANNO_ACK 0
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c index 3f7bb11..d35243e 100644 --- a/net/rxrpc/recvmsg.c +++ b/net/rxrpc/recvmsg.c
@@ -175,7 +175,7 @@ static void rxrpc_end_rx_phase(struct rxrpc_call *call, rxrpc_serial_t serial) /* * Discard a packet we've used up and advance the Rx window by one. */ -static void rxrpc_rotate_rx_window(struct rxrpc_call *call) +static void rxrpc_rotate_rx_window(struct rxrpc_call *call, unsigned nr_rot) { struct rxrpc_skb_priv *sp; struct sk_buff *skb; @@ -219,7 +219,8 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call) rxrpc_propose_ACK(call, RXRPC_ACK_DELAY, 0, serial, true, true, rxrpc_propose_ack_rotate_rx); - if (call->ackr_reason && call->ackr_reason != RXRPC_ACK_DELAY) + if ((call->ackr_reason && call->ackr_reason != RXRPC_ACK_DELAY) || + (nr_rot & 3) == 3) rxrpc_send_ack_packet(call, false, NULL); } } @@ -310,7 +311,7 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, rxrpc_seq_t hard_ack, top, seq; size_t remain; bool last; - unsigned int rx_pkt_offset, rx_pkt_len; + unsigned int rx_pkt_offset, rx_pkt_len, nr_rot = 0; int ix, copy, ret = -EAGAIN, ret2; if (test_and_clear_bit(RXRPC_CALL_RX_UNDERRUN, &call->flags) && @@ -394,8 +395,10 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, /* The whole packet has been transferred. */ last = sp->hdr.flags & RXRPC_LAST_PACKET; - if (!(flags & MSG_PEEK)) - rxrpc_rotate_rx_window(call); + if (!(flags & MSG_PEEK)) { + rxrpc_rotate_rx_window(call, nr_rot); + nr_rot++; + } rx_pkt_offset = 0; rx_pkt_len = 0; @@ -406,6 +409,7 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, } seq++; + cond_resched(); } out: