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

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

rxrpc: Add a tracepoint to follow the life of a packet in the Tx buffer



Add a tracepoint to follow the insertion of a packet into the transmit
buffer, its transmission and its rotation out of the buffer.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 363deeab
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -208,6 +208,32 @@ TRACE_EVENT(rxrpc_abort,
		      __entry->abort_code, __entry->error, __entry->why)
	    );

TRACE_EVENT(rxrpc_transmit,
	    TP_PROTO(struct rxrpc_call *call, enum rxrpc_transmit_trace why),

	    TP_ARGS(call, why),

	    TP_STRUCT__entry(
		    __field(struct rxrpc_call *,	call		)
		    __field(enum rxrpc_transmit_trace,	why		)
		    __field(rxrpc_seq_t,		tx_hard_ack	)
		    __field(rxrpc_seq_t,		tx_top		)
			     ),

	    TP_fast_assign(
		    __entry->call = call;
		    __entry->why = why;
		    __entry->tx_hard_ack = call->tx_hard_ack;
		    __entry->tx_top = call->tx_top;
			   ),

	    TP_printk("c=%p %s f=%08x n=%u",
		      __entry->call,
		      rxrpc_transmit_traces[__entry->why],
		      __entry->tx_hard_ack + 1,
		      __entry->tx_top - __entry->tx_hard_ack)
	    );

#endif /* _TRACE_RXRPC_H */

/* This part must be outside protection */
+12 −0
Original line number Diff line number Diff line
@@ -593,6 +593,18 @@ enum rxrpc_call_trace {

extern const char rxrpc_call_traces[rxrpc_call__nr_trace][4];

enum rxrpc_transmit_trace {
	rxrpc_transmit_wait,
	rxrpc_transmit_queue,
	rxrpc_transmit_queue_reqack,
	rxrpc_transmit_queue_last,
	rxrpc_transmit_rotate,
	rxrpc_transmit_end,
	rxrpc_transmit__nr_trace
};

extern const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4];

extern const char *const rxrpc_pkts[];
extern const char *rxrpc_acks(u8 reason);

+2 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to)

	spin_unlock(&call->lock);

	trace_rxrpc_transmit(call, rxrpc_transmit_rotate);
	wake_up(&call->waitq);

	while (list) {
@@ -107,6 +108,7 @@ static bool rxrpc_end_tx_phase(struct rxrpc_call *call, const char *abort_why)
	}

	write_unlock(&call->state_lock);
	trace_rxrpc_transmit(call, rxrpc_transmit_end);
	_leave(" = ok");
	return true;
}
+9 −0
Original line number Diff line number Diff line
@@ -132,3 +132,12 @@ const char rxrpc_client_traces[rxrpc_client__nr_trace][7] = {
	[rxrpc_client_to_waiting]	= "->Wait",
	[rxrpc_client_uncount]		= "Uncoun",
};

const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4] = {
	[rxrpc_transmit_wait]		= "WAI",
	[rxrpc_transmit_queue]		= "QUE",
	[rxrpc_transmit_queue_reqack]	= "QRA",
	[rxrpc_transmit_queue_last]	= "QLS",
	[rxrpc_transmit_rotate]		= "ROT",
	[rxrpc_transmit_end]		= "END",
};
+8 −1
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ static int rxrpc_wait_for_tx_window(struct rxrpc_sock *rx,
			break;
		}

		trace_rxrpc_transmit(call, rxrpc_transmit_wait);
		release_sock(&rx->sk);
		*timeo = schedule_timeout(*timeo);
		lock_sock(&rx->sk);
@@ -104,8 +105,14 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,
	smp_wmb();
	call->rxtx_buffer[ix] = skb;
	call->tx_top = seq;
	if (last)
	if (last) {
		set_bit(RXRPC_CALL_TX_LAST, &call->flags);
		trace_rxrpc_transmit(call, rxrpc_transmit_queue_last);
	} else if (sp->hdr.flags & RXRPC_REQUEST_ACK) {
		trace_rxrpc_transmit(call, rxrpc_transmit_queue_reqack);
	} else {
		trace_rxrpc_transmit(call, rxrpc_transmit_queue);
	}

	if (last || call->state == RXRPC_CALL_SERVER_ACK_REQUEST) {
		_debug("________awaiting reply/ACK__________");