Commit b0346843 authored by David Howells's avatar David Howells
Browse files

rxrpc: Transmit ACKs at the point of generation



For ACKs generated inside the I/O thread, transmit the ACK at the point of
generation.  Where the ACK is generated outside of the I/O thread, it's
offloaded to the I/O thread to transmit it.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
parent a2cf3264
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@
	EM(rxrpc_local_put_peer,		"PUT peer    ") \
	EM(rxrpc_local_put_prealloc_conn,	"PUT conn-pre") \
	EM(rxrpc_local_put_release_sock,	"PUT rel-sock") \
	EM(rxrpc_local_see_tx_ack,		"SEE tx-ack  ") \
	EM(rxrpc_local_stop,			"STOP        ") \
	EM(rxrpc_local_stopped,			"STOPPED     ") \
	EM(rxrpc_local_unuse_bind,		"UNU bind    ") \
@@ -156,7 +155,6 @@
	EM(rxrpc_call_get_recvmsg,		"GET recvmsg ") \
	EM(rxrpc_call_get_release_sock,		"GET rel-sock") \
	EM(rxrpc_call_get_sendmsg,		"GET sendmsg ") \
	EM(rxrpc_call_get_send_ack,		"GET send-ack") \
	EM(rxrpc_call_get_userid,		"GET user-id ") \
	EM(rxrpc_call_new_client,		"NEW client  ") \
	EM(rxrpc_call_new_prealloc_service,	"NEW prealloc") \
@@ -168,7 +166,6 @@
	EM(rxrpc_call_put_recvmsg,		"PUT recvmsg ") \
	EM(rxrpc_call_put_release_sock,		"PUT rls-sock") \
	EM(rxrpc_call_put_release_sock_tba,	"PUT rls-sk-a") \
	EM(rxrpc_call_put_send_ack,		"PUT send-ack") \
	EM(rxrpc_call_put_sendmsg,		"PUT sendmsg ") \
	EM(rxrpc_call_put_unnotify,		"PUT unnotify") \
	EM(rxrpc_call_put_userid_exists,	"PUT u-exists") \
+1 −4
Original line number Diff line number Diff line
@@ -287,8 +287,6 @@ struct rxrpc_local {
	struct hlist_node	link;
	struct socket		*socket;	/* my UDP socket */
	struct task_struct	*io_thread;
	struct list_head	ack_tx_queue;	/* List of ACKs that need sending */
	spinlock_t		ack_tx_lock;	/* ACK list lock */
	struct rxrpc_sock __rcu	*service;	/* Service(s) listening on this endpoint */
	struct rw_semaphore	defrag_sem;	/* control re-enablement of IP DF bit */
	struct sk_buff_head	rx_queue;	/* Received packets */
@@ -762,7 +760,6 @@ struct rxrpc_txbuf {
	struct rcu_head		rcu;
	struct list_head	call_link;	/* Link in call->tx_sendmsg/tx_buffer */
	struct list_head	tx_link;	/* Link in live Enc queue or Tx queue */
	struct rxrpc_call	*call;		/* Call to which belongs */
	ktime_t			last_sent;	/* Time at which last transmitted */
	refcount_t		ref;
	rxrpc_seq_t		seq;		/* Sequence number of this packet */
@@ -1047,7 +1044,7 @@ static inline struct rxrpc_net *rxrpc_net(struct net *net)
/*
 * output.c
 */
void rxrpc_transmit_ack_packets(struct rxrpc_local *);
int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb);
int rxrpc_send_abort_packet(struct rxrpc_call *);
int rxrpc_send_data_packet(struct rxrpc_call *, struct rxrpc_txbuf *);
void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb);
+2 −15
Original line number Diff line number Diff line
@@ -69,7 +69,6 @@ void rxrpc_propose_delay_ACK(struct rxrpc_call *call, rxrpc_serial_t serial,
void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason,
		    rxrpc_serial_t serial, enum rxrpc_propose_ack_trace why)
{
	struct rxrpc_local *local = call->conn->local;
	struct rxrpc_txbuf *txb;

	if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
@@ -96,17 +95,9 @@ void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason,
	txb->ack.reason		= ack_reason;
	txb->ack.nAcks		= 0;

	if (!rxrpc_try_get_call(call, rxrpc_call_get_send_ack)) {
		rxrpc_put_txbuf(txb, rxrpc_txbuf_put_nomem);
		return;
	}

	spin_lock(&local->ack_tx_lock);
	list_add_tail(&txb->tx_link, &local->ack_tx_queue);
	spin_unlock(&local->ack_tx_lock);
	trace_rxrpc_send_ack(call, why, ack_reason, serial);

	rxrpc_wake_up_io_thread(local);
	rxrpc_send_ack_packet(call, txb);
	rxrpc_put_txbuf(txb, rxrpc_txbuf_put_ack_tx);
}

/*
@@ -294,10 +285,6 @@ static void rxrpc_decant_prepared_tx(struct rxrpc_call *call)

		rxrpc_transmit_one(call, txb);

		// TODO: Drain the transmission buffers.  Do this somewhere better
		if (after(call->acks_hard_ack, call->tx_bottom + 16))
			rxrpc_shrink_call_tx_buffer(call);

		if (!rxrpc_tx_window_has_space(call))
			break;
	}
+0 −5
Original line number Diff line number Diff line
@@ -447,11 +447,6 @@ int rxrpc_io_thread(void *data)
			continue;
		}

		if (!list_empty(&local->ack_tx_queue)) {
			rxrpc_transmit_ack_packets(local);
			continue;
		}

		/* Process received packets and errors. */
		if ((skb = __skb_dequeue(&rx_queue))) {
			switch (skb->mark) {
+0 −2
Original line number Diff line number Diff line
@@ -96,8 +96,6 @@ static struct rxrpc_local *rxrpc_alloc_local(struct rxrpc_net *rxnet,
		atomic_set(&local->active_users, 1);
		local->rxnet = rxnet;
		INIT_HLIST_NODE(&local->link);
		INIT_LIST_HEAD(&local->ack_tx_queue);
		spin_lock_init(&local->ack_tx_lock);
		init_rwsem(&local->defrag_sem);
		skb_queue_head_init(&local->rx_queue);
		INIT_LIST_HEAD(&local->call_attend_q);
Loading