Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db7a934a authored by David Howells's avatar David Howells Committed by Greg Kroah-Hartman
Browse files

rxrpc: Trace discarded ACKs



[ Upstream commit d1f129470e6cb79b8b97fecd12689f6eb49e27fe ]

Add a tracepoint to track received ACKs that are discarded due to being
outside of the Tx window.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent d268f8dd
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -1549,6 +1549,41 @@ TRACE_EVENT(rxrpc_notify_socket,
		      __entry->serial)
	    );

TRACE_EVENT(rxrpc_rx_discard_ack,
	    TP_PROTO(unsigned int debug_id, rxrpc_serial_t serial,
		     rxrpc_seq_t first_soft_ack, rxrpc_seq_t call_ackr_first,
		     rxrpc_seq_t prev_pkt, rxrpc_seq_t call_ackr_prev),

	    TP_ARGS(debug_id, serial, first_soft_ack, call_ackr_first,
		    prev_pkt, call_ackr_prev),

	    TP_STRUCT__entry(
		    __field(unsigned int,	debug_id	)
		    __field(rxrpc_serial_t,	serial		)
		    __field(rxrpc_seq_t,	first_soft_ack)
		    __field(rxrpc_seq_t,	call_ackr_first)
		    __field(rxrpc_seq_t,	prev_pkt)
		    __field(rxrpc_seq_t,	call_ackr_prev)
			     ),

	    TP_fast_assign(
		    __entry->debug_id		= debug_id;
		    __entry->serial		= serial;
		    __entry->first_soft_ack	= first_soft_ack;
		    __entry->call_ackr_first	= call_ackr_first;
		    __entry->prev_pkt		= prev_pkt;
		    __entry->call_ackr_prev	= call_ackr_prev;
			   ),

	    TP_printk("c=%08x r=%08x %08x<%08x %08x<%08x",
		      __entry->debug_id,
		      __entry->serial,
		      __entry->first_soft_ack,
		      __entry->call_ackr_first,
		      __entry->prev_pkt,
		      __entry->call_ackr_prev)
	    );

#endif /* _TRACE_RXRPC_H */

/* This part must be outside protection */
+10 −2
Original line number Diff line number Diff line
@@ -879,8 +879,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,

	/* Discard any out-of-order or duplicate ACKs (outside lock). */
	if (before(first_soft_ack, call->ackr_first_seq) ||
	    before(prev_pkt, call->ackr_prev_seq))
	    before(prev_pkt, call->ackr_prev_seq)) {
		trace_rxrpc_rx_discard_ack(call->debug_id, sp->hdr.serial,
					   first_soft_ack, call->ackr_first_seq,
					   prev_pkt, call->ackr_prev_seq);
		return;
	}

	buf.info.rxMTU = 0;
	ioffset = offset + nr_acks + 3;
@@ -892,8 +896,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,

	/* Discard any out-of-order or duplicate ACKs (inside lock). */
	if (before(first_soft_ack, call->ackr_first_seq) ||
	    before(prev_pkt, call->ackr_prev_seq))
	    before(prev_pkt, call->ackr_prev_seq)) {
		trace_rxrpc_rx_discard_ack(call->debug_id, sp->hdr.serial,
					   first_soft_ack, call->ackr_first_seq,
					   prev_pkt, call->ackr_prev_seq);
		goto out;
	}
	call->acks_latest_ts = skb->tstamp;
	call->acks_latest = sp->hdr.serial;