Commit 5bbf9533 authored by David Howells's avatar David Howells
Browse files

rxrpc: De-atomic call->ackr_window and call->ackr_nr_unacked



call->ackr_window doesn't need to be atomic as ACK generation and ACK
transmission are now done in the same thread, so drop the atomic64 handling
and split it into two separate members.

Similarly, call->ackr_nr_unacked doesn't need to be atomic now either.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
parent 84e28aa5
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1152,7 +1152,8 @@ TRACE_EVENT(rxrpc_receive,
		    __field(enum rxrpc_receive_trace,	why)
		    __field(rxrpc_serial_t,		serial)
		    __field(rxrpc_seq_t,		seq)
		    __field(u64,			window)
		    __field(rxrpc_seq_t,		window)
		    __field(rxrpc_seq_t,		wtop)
			     ),

	    TP_fast_assign(
@@ -1160,7 +1161,8 @@ TRACE_EVENT(rxrpc_receive,
		    __entry->why = why;
		    __entry->serial = serial;
		    __entry->seq = seq;
		    __entry->window = atomic64_read(&call->ackr_window);
		    __entry->window = call->ackr_window;
		    __entry->wtop = call->ackr_wtop;
			   ),

	    TP_printk("c=%08x %s r=%08x q=%08x w=%08x-%08x",
@@ -1168,8 +1170,8 @@ TRACE_EVENT(rxrpc_receive,
		      __print_symbolic(__entry->why, rxrpc_receive_traces),
		      __entry->serial,
		      __entry->seq,
		      lower_32_bits(__entry->window),
		      upper_32_bits(__entry->window))
		      __entry->window,
		      __entry->wtop)
	    );

TRACE_EVENT(rxrpc_recvmsg,
+3 −2
Original line number Diff line number Diff line
@@ -692,8 +692,9 @@ struct rxrpc_call {
	/* Receive-phase ACK management (ACKs we send). */
	u8			ackr_reason;	/* reason to ACK */
	rxrpc_serial_t		ackr_serial;	/* serial of packet being ACK'd */
	atomic64_t		ackr_window;	/* Base (in LSW) and top (in MSW) of SACK window */
	atomic_t		ackr_nr_unacked; /* Number of unacked packets */
	rxrpc_seq_t		ackr_window;	/* Base of SACK window */
	rxrpc_seq_t		ackr_wtop;	/* Base of SACK window */
	unsigned int		ackr_nr_unacked; /* Number of unacked packets */
	atomic_t		ackr_nr_consumed; /* Number of packets needing hard ACK */
	struct {
#define RXRPC_SACK_SIZE 256
+1 −1
Original line number Diff line number Diff line
@@ -498,7 +498,7 @@ bool rxrpc_input_call_event(struct rxrpc_call *call, struct sk_buff *skb)
		rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0,
			       rxrpc_propose_ack_rx_idle);

	if (atomic_read(&call->ackr_nr_unacked) > 2) {
	if (call->ackr_nr_unacked > 2) {
		if (call->peer->rtt_count < 3)
			rxrpc_send_ACK(call, RXRPC_ACK_PING, 0,
				       rxrpc_propose_ack_ping_for_rtt);
+2 −1
Original line number Diff line number Diff line
@@ -167,7 +167,8 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp,
	call->tx_total_len = -1;
	call->next_rx_timo = 20 * HZ;
	call->next_req_timo = 1 * HZ;
	atomic64_set(&call->ackr_window, 0x100000001ULL);
	call->ackr_window = 1;
	call->ackr_wtop = 1;

	memset(&call->sock_node, 0xed, sizeof(call->sock_node));

+7 −7
Original line number Diff line number Diff line
@@ -338,7 +338,8 @@ static void rxrpc_end_rx_phase(struct rxrpc_call *call, rxrpc_serial_t serial)
static void rxrpc_input_update_ack_window(struct rxrpc_call *call,
					  rxrpc_seq_t window, rxrpc_seq_t wtop)
{
	atomic64_set_release(&call->ackr_window, ((u64)wtop) << 32 | window);
	call->ackr_window = window;
	call->ackr_wtop = wtop;
}

/*
@@ -367,9 +368,8 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb,
	struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
	struct sk_buff *oos;
	rxrpc_serial_t serial = sp->hdr.serial;
	u64 win = atomic64_read(&call->ackr_window);
	rxrpc_seq_t window = lower_32_bits(win);
	rxrpc_seq_t wtop = upper_32_bits(win);
	rxrpc_seq_t window = call->ackr_window;
	rxrpc_seq_t wtop = call->ackr_wtop;
	rxrpc_seq_t wlimit = window + call->rx_winsize - 1;
	rxrpc_seq_t seq = sp->hdr.seq;
	bool last = sp->hdr.flags & RXRPC_LAST_PACKET;
@@ -419,7 +419,7 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb,
		else if (!skb_queue_empty(&call->rx_oos_queue))
			ack_reason = RXRPC_ACK_DELAY;
		else
			atomic_inc_return(&call->ackr_nr_unacked);
			call->ackr_nr_unacked++;

		window++;
		if (after(window, wtop))
@@ -567,8 +567,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb)
	rxrpc_serial_t serial = sp->hdr.serial;
	rxrpc_seq_t seq0 = sp->hdr.seq;

	_enter("{%llx,%x},{%u,%x}",
	       atomic64_read(&call->ackr_window), call->rx_highest_seq,
	_enter("{%x,%x,%x},{%u,%x}",
	       call->ackr_window, call->ackr_wtop, call->rx_highest_seq,
	       skb->len, seq0);

	if (__rxrpc_call_is_complete(call))
Loading