Skip to content

Commit d1f1294

Browse files
committed
rxrpc: Trace discarded ACKs
Add a tracepoint to track received ACKs that are discarded due to being outside of the Tx window. Signed-off-by: David Howells <[email protected]>
1 parent c410bf0 commit d1f1294

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

include/trace/events/rxrpc.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,6 +1541,41 @@ TRACE_EVENT(rxrpc_notify_socket,
15411541
__entry->serial)
15421542
);
15431543

1544+
TRACE_EVENT(rxrpc_rx_discard_ack,
1545+
TP_PROTO(unsigned int debug_id, rxrpc_serial_t serial,
1546+
rxrpc_seq_t first_soft_ack, rxrpc_seq_t call_ackr_first,
1547+
rxrpc_seq_t prev_pkt, rxrpc_seq_t call_ackr_prev),
1548+
1549+
TP_ARGS(debug_id, serial, first_soft_ack, call_ackr_first,
1550+
prev_pkt, call_ackr_prev),
1551+
1552+
TP_STRUCT__entry(
1553+
__field(unsigned int, debug_id )
1554+
__field(rxrpc_serial_t, serial )
1555+
__field(rxrpc_seq_t, first_soft_ack)
1556+
__field(rxrpc_seq_t, call_ackr_first)
1557+
__field(rxrpc_seq_t, prev_pkt)
1558+
__field(rxrpc_seq_t, call_ackr_prev)
1559+
),
1560+
1561+
TP_fast_assign(
1562+
__entry->debug_id = debug_id;
1563+
__entry->serial = serial;
1564+
__entry->first_soft_ack = first_soft_ack;
1565+
__entry->call_ackr_first = call_ackr_first;
1566+
__entry->prev_pkt = prev_pkt;
1567+
__entry->call_ackr_prev = call_ackr_prev;
1568+
),
1569+
1570+
TP_printk("c=%08x r=%08x %08x<%08x %08x<%08x",
1571+
__entry->debug_id,
1572+
__entry->serial,
1573+
__entry->first_soft_ack,
1574+
__entry->call_ackr_first,
1575+
__entry->prev_pkt,
1576+
__entry->call_ackr_prev)
1577+
);
1578+
15441579
#endif /* _TRACE_RXRPC_H */
15451580

15461581
/* This part must be outside protection */

net/rxrpc/input.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -866,8 +866,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb)
866866

867867
/* Discard any out-of-order or duplicate ACKs (outside lock). */
868868
if (before(first_soft_ack, call->ackr_first_seq) ||
869-
before(prev_pkt, call->ackr_prev_seq))
869+
before(prev_pkt, call->ackr_prev_seq)) {
870+
trace_rxrpc_rx_discard_ack(call->debug_id, sp->hdr.serial,
871+
first_soft_ack, call->ackr_first_seq,
872+
prev_pkt, call->ackr_prev_seq);
870873
return;
874+
}
871875

872876
buf.info.rxMTU = 0;
873877
ioffset = offset + nr_acks + 3;
@@ -879,8 +883,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb)
879883

880884
/* Discard any out-of-order or duplicate ACKs (inside lock). */
881885
if (before(first_soft_ack, call->ackr_first_seq) ||
882-
before(prev_pkt, call->ackr_prev_seq))
886+
before(prev_pkt, call->ackr_prev_seq)) {
887+
trace_rxrpc_rx_discard_ack(call->debug_id, sp->hdr.serial,
888+
first_soft_ack, call->ackr_first_seq,
889+
prev_pkt, call->ackr_prev_seq);
883890
goto out;
891+
}
884892
call->acks_latest_ts = skb->tstamp;
885893

886894
call->ackr_first_seq = first_soft_ack;

0 commit comments

Comments
 (0)