rxrpc: Add a tracepoint to log ACK transmission
Add a tracepoint to log information about ACK transmission. Signed-off-by: David Howels <dhowells@redhat.com>
This commit is contained in:
@@ -260,6 +260,36 @@ TRACE_EVENT(rxrpc_rx_ack,
|
|||||||
__entry->n_acks)
|
__entry->n_acks)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(rxrpc_tx_ack,
|
||||||
|
TP_PROTO(struct rxrpc_call *call, rxrpc_seq_t first,
|
||||||
|
rxrpc_serial_t serial, u8 reason, u8 n_acks),
|
||||||
|
|
||||||
|
TP_ARGS(call, first, serial, reason, n_acks),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(struct rxrpc_call *, call )
|
||||||
|
__field(rxrpc_seq_t, first )
|
||||||
|
__field(rxrpc_serial_t, serial )
|
||||||
|
__field(u8, reason )
|
||||||
|
__field(u8, n_acks )
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->call = call;
|
||||||
|
__entry->first = first;
|
||||||
|
__entry->serial = serial;
|
||||||
|
__entry->reason = reason;
|
||||||
|
__entry->n_acks = n_acks;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("c=%p %s f=%08x r=%08x n=%u",
|
||||||
|
__entry->call,
|
||||||
|
rxrpc_acks(__entry->reason),
|
||||||
|
__entry->first,
|
||||||
|
__entry->serial,
|
||||||
|
__entry->n_acks)
|
||||||
|
);
|
||||||
|
|
||||||
#endif /* _TRACE_RXRPC_H */
|
#endif /* _TRACE_RXRPC_H */
|
||||||
|
|
||||||
/* This part must be outside protection */
|
/* This part must be outside protection */
|
||||||
|
|||||||
@@ -98,6 +98,9 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
|
|||||||
pkt.info.rwind = htonl(rxrpc_rx_window_size);
|
pkt.info.rwind = htonl(rxrpc_rx_window_size);
|
||||||
pkt.info.jumbo_max = htonl(rxrpc_rx_jumbo_max);
|
pkt.info.jumbo_max = htonl(rxrpc_rx_jumbo_max);
|
||||||
len += sizeof(pkt.ack) + sizeof(pkt.info);
|
len += sizeof(pkt.ack) + sizeof(pkt.info);
|
||||||
|
|
||||||
|
trace_rxrpc_tx_ack(NULL, chan->last_seq, 0,
|
||||||
|
RXRPC_ACK_DUPLICATE, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,12 +38,14 @@ struct rxrpc_pkt_buffer {
|
|||||||
static size_t rxrpc_fill_out_ack(struct rxrpc_call *call,
|
static size_t rxrpc_fill_out_ack(struct rxrpc_call *call,
|
||||||
struct rxrpc_pkt_buffer *pkt)
|
struct rxrpc_pkt_buffer *pkt)
|
||||||
{
|
{
|
||||||
|
rxrpc_serial_t serial;
|
||||||
rxrpc_seq_t hard_ack, top, seq;
|
rxrpc_seq_t hard_ack, top, seq;
|
||||||
int ix;
|
int ix;
|
||||||
u32 mtu, jmax;
|
u32 mtu, jmax;
|
||||||
u8 *ackp = pkt->acks;
|
u8 *ackp = pkt->acks;
|
||||||
|
|
||||||
/* Barrier against rxrpc_input_data(). */
|
/* Barrier against rxrpc_input_data(). */
|
||||||
|
serial = call->ackr_serial;
|
||||||
hard_ack = READ_ONCE(call->rx_hard_ack);
|
hard_ack = READ_ONCE(call->rx_hard_ack);
|
||||||
top = smp_load_acquire(&call->rx_top);
|
top = smp_load_acquire(&call->rx_top);
|
||||||
|
|
||||||
@@ -51,7 +53,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_call *call,
|
|||||||
pkt->ack.maxSkew = htons(call->ackr_skew);
|
pkt->ack.maxSkew = htons(call->ackr_skew);
|
||||||
pkt->ack.firstPacket = htonl(hard_ack + 1);
|
pkt->ack.firstPacket = htonl(hard_ack + 1);
|
||||||
pkt->ack.previousPacket = htonl(call->ackr_prev_seq);
|
pkt->ack.previousPacket = htonl(call->ackr_prev_seq);
|
||||||
pkt->ack.serial = htonl(call->ackr_serial);
|
pkt->ack.serial = htonl(serial);
|
||||||
pkt->ack.reason = call->ackr_reason;
|
pkt->ack.reason = call->ackr_reason;
|
||||||
pkt->ack.nAcks = top - hard_ack;
|
pkt->ack.nAcks = top - hard_ack;
|
||||||
|
|
||||||
@@ -75,6 +77,9 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_call *call,
|
|||||||
pkt->ackinfo.rwind = htonl(call->rx_winsize);
|
pkt->ackinfo.rwind = htonl(call->rx_winsize);
|
||||||
pkt->ackinfo.jumbo_max = htonl(jmax);
|
pkt->ackinfo.jumbo_max = htonl(jmax);
|
||||||
|
|
||||||
|
trace_rxrpc_tx_ack(call, hard_ack + 1, serial, call->ackr_reason,
|
||||||
|
top - hard_ack);
|
||||||
|
|
||||||
*ackp++ = 0;
|
*ackp++ = 0;
|
||||||
*ackp++ = 0;
|
*ackp++ = 0;
|
||||||
*ackp++ = 0;
|
*ackp++ = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user