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: