rxrpc: Trace ack.rwind

Log ack.rwind in the rxrpc_tx_ack tracepoint.  This value is useful to see
as it represents flow-control information to the peer.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
This commit is contained in:
David Howells 2023-01-31 15:31:49 +00:00
parent a33395ab85
commit f789bff2de
3 changed files with 15 additions and 8 deletions

View File

@ -1118,9 +1118,9 @@ TRACE_EVENT(rxrpc_tx_data,
TRACE_EVENT(rxrpc_tx_ack, TRACE_EVENT(rxrpc_tx_ack,
TP_PROTO(unsigned int call, rxrpc_serial_t serial, TP_PROTO(unsigned int call, rxrpc_serial_t serial,
rxrpc_seq_t ack_first, rxrpc_serial_t ack_serial, rxrpc_seq_t ack_first, rxrpc_serial_t ack_serial,
u8 reason, u8 n_acks), u8 reason, u8 n_acks, u16 rwind),
TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks), TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks, rwind),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, call) __field(unsigned int, call)
@ -1129,6 +1129,7 @@ TRACE_EVENT(rxrpc_tx_ack,
__field(rxrpc_serial_t, ack_serial) __field(rxrpc_serial_t, ack_serial)
__field(u8, reason) __field(u8, reason)
__field(u8, n_acks) __field(u8, n_acks)
__field(u16, rwind)
), ),
TP_fast_assign( TP_fast_assign(
@ -1138,15 +1139,17 @@ TRACE_EVENT(rxrpc_tx_ack,
__entry->ack_serial = ack_serial; __entry->ack_serial = ack_serial;
__entry->reason = reason; __entry->reason = reason;
__entry->n_acks = n_acks; __entry->n_acks = n_acks;
__entry->rwind = rwind;
), ),
TP_printk(" c=%08x ACK %08x %s f=%08x r=%08x n=%u", TP_printk(" c=%08x ACK %08x %s f=%08x r=%08x n=%u rw=%u",
__entry->call, __entry->call,
__entry->serial, __entry->serial,
__print_symbolic(__entry->reason, rxrpc_ack_names), __print_symbolic(__entry->reason, rxrpc_ack_names),
__entry->ack_first, __entry->ack_first,
__entry->ack_serial, __entry->ack_serial,
__entry->n_acks) __entry->n_acks,
__entry->rwind)
); );
TRACE_EVENT(rxrpc_receive, TRACE_EVENT(rxrpc_receive,

View File

@ -163,7 +163,7 @@ void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
trace_rxrpc_tx_ack(chan->call_debug_id, serial, trace_rxrpc_tx_ack(chan->call_debug_id, serial,
ntohl(pkt.ack.firstPacket), ntohl(pkt.ack.firstPacket),
ntohl(pkt.ack.serial), ntohl(pkt.ack.serial),
pkt.ack.reason, 0); pkt.ack.reason, 0, rxrpc_rx_window_size);
break; break;
default: default:

View File

@ -80,7 +80,8 @@ static void rxrpc_set_keepalive(struct rxrpc_call *call)
*/ */
static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
struct rxrpc_call *call, struct rxrpc_call *call,
struct rxrpc_txbuf *txb) struct rxrpc_txbuf *txb,
u16 *_rwind)
{ {
struct rxrpc_ackinfo ackinfo; struct rxrpc_ackinfo ackinfo;
unsigned int qsize, sack, wrap, to; unsigned int qsize, sack, wrap, to;
@ -124,6 +125,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn,
jmax = rxrpc_rx_jumbo_max; jmax = rxrpc_rx_jumbo_max;
qsize = (window - 1) - call->rx_consumed; qsize = (window - 1) - call->rx_consumed;
rsize = max_t(int, call->rx_winsize - qsize, 0); rsize = max_t(int, call->rx_winsize - qsize, 0);
*_rwind = rsize;
ackinfo.rxMTU = htonl(rxrpc_rx_mtu); ackinfo.rxMTU = htonl(rxrpc_rx_mtu);
ackinfo.maxMTU = htonl(mtu); ackinfo.maxMTU = htonl(mtu);
ackinfo.rwind = htonl(rsize); ackinfo.rwind = htonl(rsize);
@ -190,6 +192,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
rxrpc_serial_t serial; rxrpc_serial_t serial;
size_t len, n; size_t len, n;
int ret, rtt_slot = -1; int ret, rtt_slot = -1;
u16 rwind;
if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
return -ECONNRESET; return -ECONNRESET;
@ -205,7 +208,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
if (txb->ack.reason == RXRPC_ACK_PING) if (txb->ack.reason == RXRPC_ACK_PING)
txb->wire.flags |= RXRPC_REQUEST_ACK; txb->wire.flags |= RXRPC_REQUEST_ACK;
n = rxrpc_fill_out_ack(conn, call, txb); n = rxrpc_fill_out_ack(conn, call, txb, &rwind);
if (n == 0) if (n == 0)
return 0; return 0;
@ -217,7 +220,8 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
txb->wire.serial = htonl(serial); txb->wire.serial = htonl(serial);
trace_rxrpc_tx_ack(call->debug_id, serial, trace_rxrpc_tx_ack(call->debug_id, serial,
ntohl(txb->ack.firstPacket), ntohl(txb->ack.firstPacket),
ntohl(txb->ack.serial), txb->ack.reason, txb->ack.nAcks); ntohl(txb->ack.serial), txb->ack.reason, txb->ack.nAcks,
rwind);
if (txb->ack.reason == RXRPC_ACK_PING) if (txb->ack.reason == RXRPC_ACK_PING)
rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping); rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping);