rxrpc: Transmit ACKs from krxrpctxd
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index 91fc195..922c02c 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -1033,7 +1033,6 @@ static inline struct rxrpc_net *rxrpc_net(struct net *net)
 /*
  * output.c
  */
-void rxrpc_transmit_ack_packets(struct rxrpc_local *);
 int rxrpc_send_abort_packet(struct rxrpc_call *);
 void rxrpc_reject_packets(struct rxrpc_local *);
 void rxrpc_send_keepalive(struct rxrpc_peer *);
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c
index 0b5aa91..1e4dca9 100644
--- a/net/rxrpc/call_event.c
+++ b/net/rxrpc/call_event.c
@@ -110,13 +110,7 @@ void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason,
 	list_add_tail(&txb->tx_link, &local->ack_tx_queue);
 	spin_unlock_bh(&local->ack_tx_lock);
 	trace_rxrpc_send_ack(call, why, ack_reason, serial);
-
-	if (in_task()) {
-		rxrpc_transmit_ack_packets(call->peer->local);
-	} else {
-		rxrpc_get_local(local);
-		rxrpc_queue_local(local);
-	}
+	rxrpc_wake_up_transmitter(local);
 }
 
 /*
diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c
index 73ffe42..f01b049 100644
--- a/net/rxrpc/local_object.c
+++ b/net/rxrpc/local_object.c
@@ -443,11 +443,6 @@ static void rxrpc_local_processor(struct work_struct *work)
 			break;
 		}
 
-		if (!list_empty(&local->ack_tx_queue)) {
-			rxrpc_transmit_ack_packets(local);
-			again = true;
-		}
-
 		if (!skb_queue_empty(&local->reject_queue)) {
 			rxrpc_reject_packets(local);
 			again = true;
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c
index 72be4ba4..eb03776 100644
--- a/net/rxrpc/output.c
+++ b/net/rxrpc/output.c
@@ -72,9 +72,9 @@ static void rxrpc_set_keepalive(struct rxrpc_call *call)
 /*
  * Fill out an ACK packet.
  */
-static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
-				 struct rxrpc_call *call,
-				 struct rxrpc_txbuf *txb)
+static bool rxrpc_fill_out_ack(struct rxrpc_connection *conn,
+			       struct rxrpc_call *call,
+			       struct rxrpc_txbuf *txb)
 {
 	struct rxrpc_ackinfo ackinfo;
 	unsigned int tmp, qsize;
@@ -90,7 +90,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
 	if (!tmp && (txb->ack.reason == RXRPC_ACK_DELAY ||
 		     txb->ack.reason == RXRPC_ACK_IDLE)) {
 		rxrpc_inc_stat(call->rxnet, stat_tx_ack_skip);
-		return 0;
+		return false;
 	}
 
 	rxrpc_inc_stat(call->rxnet, stat_tx_ack_fill);
@@ -158,7 +158,8 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
 	*ackp++ = 0;
 	*ackp++ = 0;
 	memcpy(ackp, &ackinfo, sizeof(ackinfo));
-	return txb->ack.nAcks + 3 + sizeof(ackinfo);
+	txb->len = sizeof(txb->ack) + txb->ack.nAcks + 3 + sizeof(ackinfo);
+	return true;
 }
 
 /*
@@ -210,12 +211,11 @@ static void rxrpc_cancel_rtt_probe(struct rxrpc_call *call,
 static int rxrpc_send_ack_packet(struct rxrpc_local *local, struct rxrpc_txbuf *txb)
 {
 	struct rxrpc_connection *conn;
-	struct rxrpc_ack_buffer *pkt;
 	struct rxrpc_call *call = txb->call;
 	struct msghdr msg;
 	struct kvec iov[1];
 	rxrpc_serial_t serial;
-	size_t len, n;
+	size_t len;
 	int ret, rtt_slot = -1;
 
 	if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
@@ -237,12 +237,11 @@ static int rxrpc_send_ack_packet(struct rxrpc_local *local, struct rxrpc_txbuf *
 	if (txb->ack.reason == RXRPC_ACK_IDLE)
 		clear_bit(RXRPC_CALL_IDLE_ACK_PENDING, &call->flags);
 
-	n = rxrpc_fill_out_ack(conn, call, txb);
-	if (n == 0)
+	if (!rxrpc_fill_out_ack(conn, call, txb))
 		return 0;
 
 	iov[0].iov_base	= &txb->wire;
-	iov[0].iov_len	= sizeof(txb->wire) + sizeof(txb->ack) + n;
+	iov[0].iov_len	= sizeof(txb->wire) + txb->len;
 	len = iov[0].iov_len;
 
 	serial = atomic_inc_return(&conn->serial);
@@ -279,7 +278,6 @@ static int rxrpc_send_ack_packet(struct rxrpc_local *local, struct rxrpc_txbuf *
 		rxrpc_set_keepalive(call);
 	}
 
-	kfree(pkt);
 	return ret;
 }
 
@@ -288,7 +286,7 @@ static int rxrpc_send_ack_packet(struct rxrpc_local *local, struct rxrpc_txbuf *
  * transmission, so we can only transmit one packet at a time, ACK, DATA or
  * otherwise.
  */
-void rxrpc_transmit_ack_packets(struct rxrpc_local *local)
+static void rxrpc_transmit_ack_packets(struct rxrpc_local *local)
 {
 	LIST_HEAD(queue);
 	int ret;
@@ -297,9 +295,6 @@ void rxrpc_transmit_ack_packets(struct rxrpc_local *local)
 			  refcount_read(&local->ref), NULL);
 	rxrpc_inc_stat(local->rxnet, stat_tx_ack_transmitter);
 
-	if (list_empty(&local->ack_tx_queue))
-		return;
-
 	spin_lock_bh(&local->ack_tx_lock);
 	list_splice_tail_init(&local->ack_tx_queue, &queue);
 	spin_unlock_bh(&local->ack_tx_lock);
@@ -794,6 +789,8 @@ int rxrpc_transmitter(void *data)
 
 	for (;;) {
 		rxrpc_inc_stat(local->rxnet, stat_tx_loop);
+		if (!list_empty(&local->ack_tx_queue))
+			rxrpc_transmit_ack_packets(local);
 
 		spin_lock(&local->tx_lock);
 		txb = list_first_entry_or_null(&local->tx_re_queue,
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
index 80c6fd5..c491fa8 100644
--- a/net/rxrpc/recvmsg.c
+++ b/net/rxrpc/recvmsg.c
@@ -269,11 +269,9 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
 	acked = atomic_add_return(call->rx_consumed - old_consumed,
 				  &call->ackr_nr_consumed);
 	if (acked > 2 &&
-	    !test_and_set_bit(RXRPC_CALL_IDLE_ACK_PENDING, &call->flags)) {
+	    !test_and_set_bit(RXRPC_CALL_IDLE_ACK_PENDING, &call->flags))
 		rxrpc_send_ACK(call, RXRPC_ACK_IDLE, serial,
 			       rxrpc_propose_ack_rotate_rx);
-		rxrpc_transmit_ack_packets(call->peer->local);
-	}
 }
 
 /*
@@ -406,7 +404,6 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call,
 				ret = ret2;
 				goto out;
 			}
-			rxrpc_transmit_ack_packets(call->peer->local);
 		} else {
 			trace_rxrpc_recvdata(call, rxrpc_recvmsg_cont, seq,
 					     rx_pkt_sub, rx_pkt_offset, rx_pkt_len, 0);
@@ -603,7 +600,6 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 		if (ret == -EAGAIN)
 			ret = 0;
 
-		rxrpc_transmit_ack_packets(call->peer->local);
 		if (!skb_queue_empty(&call->rx_queue))
 			rxrpc_notify_socket(call);
 		break;
@@ -733,7 +729,6 @@ int rxrpc_kernel_recv_data(struct socket *sock, struct rxrpc_call *call,
 read_phase_complete:
 	ret = 1;
 out:
-	rxrpc_transmit_ack_packets(call->peer->local);
 	if (_service)
 		*_service = call->service_id;
 	mutex_unlock(&call->user_mutex);
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c
index 0e5bc23..562b671 100644
--- a/net/rxrpc/sendmsg.c
+++ b/net/rxrpc/sendmsg.c
@@ -308,8 +308,6 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
 		rxrpc_see_txbuf(txb, rxrpc_txbuf_see_send_more);
 
 	do {
-		rxrpc_transmit_ack_packets(call->peer->local);
-
 		if (!txb) {
 			size_t remain, bufsize, chunk, offset;