rxrpc: Trace ack.rwind
authorDavid Howells <dhowells@redhat.com>
Tue, 31 Jan 2023 15:31:49 +0000 (15:31 +0000)
committerDavid Howells <dhowells@redhat.com>
Tue, 7 Feb 2023 23:11:21 +0000 (23:11 +0000)
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

include/trace/events/rxrpc.h
net/rxrpc/conn_event.c
net/rxrpc/output.c

index d7bb4ac..c3c0b0a 100644 (file)
@@ -1118,9 +1118,9 @@ TRACE_EVENT(rxrpc_tx_data,
 TRACE_EVENT(rxrpc_tx_ack,
            TP_PROTO(unsigned int call, rxrpc_serial_t 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(
                    __field(unsigned int,       call)
@@ -1129,6 +1129,7 @@ TRACE_EVENT(rxrpc_tx_ack,
                    __field(rxrpc_serial_t,     ack_serial)
                    __field(u8,                 reason)
                    __field(u8,                 n_acks)
+                   __field(u16,                rwind)
                             ),
 
            TP_fast_assign(
@@ -1138,15 +1139,17 @@ TRACE_EVENT(rxrpc_tx_ack,
                    __entry->ack_serial = ack_serial;
                    __entry->reason = reason;
                    __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->serial,
                      __print_symbolic(__entry->reason, rxrpc_ack_names),
                      __entry->ack_first,
                      __entry->ack_serial,
-                     __entry->n_acks)
+                     __entry->n_acks,
+                     __entry->rwind)
            );
 
 TRACE_EVENT(rxrpc_receive,
index 44414e7..95f4bc2 100644 (file)
@@ -163,7 +163,7 @@ void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
                trace_rxrpc_tx_ack(chan->call_debug_id, serial,
                                   ntohl(pkt.ack.firstPacket),
                                   ntohl(pkt.ack.serial),
-                                  pkt.ack.reason, 0);
+                                  pkt.ack.reason, 0, rxrpc_rx_window_size);
                break;
 
        default:
index 6b20222..5e53429 100644 (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,
                                 struct rxrpc_call *call,
-                                struct rxrpc_txbuf *txb)
+                                struct rxrpc_txbuf *txb,
+                                u16 *_rwind)
 {
        struct rxrpc_ackinfo ackinfo;
        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;
        qsize = (window - 1) - call->rx_consumed;
        rsize = max_t(int, call->rx_winsize - qsize, 0);
+       *_rwind = rsize;
        ackinfo.rxMTU           = htonl(rxrpc_rx_mtu);
        ackinfo.maxMTU          = htonl(mtu);
        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;
        size_t len, n;
        int ret, rtt_slot = -1;
+       u16 rwind;
 
        if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags))
                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)
                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)
                return 0;
 
@@ -217,7 +220,8 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb)
        txb->wire.serial = htonl(serial);
        trace_rxrpc_tx_ack(call->debug_id, serial,
                           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)
                rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping);