rxrpc: Add a tracepoint to log ACK transmission
authorDavid Howells <dhowells@redhat.com>
Sat, 17 Sep 2016 09:49:13 +0000 (10:49 +0100)
committerDavid Howells <dhowells@redhat.com>
Sat, 17 Sep 2016 10:24:03 +0000 (11:24 +0100)
Add a tracepoint to log information about ACK transmission.

Signed-off-by: David Howels <dhowells@redhat.com>
include/trace/events/rxrpc.h
net/rxrpc/conn_event.c
net/rxrpc/output.c

index 2b19f3f..d545d69 100644 (file)
@@ -260,6 +260,36 @@ TRACE_EVENT(rxrpc_rx_ack,
                      __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 */
 
 /* This part must be outside protection */
index a43f4c9..9b19c51 100644 (file)
@@ -98,6 +98,9 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
                pkt.info.rwind          = htonl(rxrpc_rx_window_size);
                pkt.info.jumbo_max      = htonl(rxrpc_rx_jumbo_max);
                len += sizeof(pkt.ack) + sizeof(pkt.info);
+
+               trace_rxrpc_tx_ack(NULL, chan->last_seq, 0,
+                                  RXRPC_ACK_DUPLICATE, 0);
                break;
        }
 
index 0b21ed8..2c9daea 100644 (file)
@@ -38,12 +38,14 @@ struct rxrpc_pkt_buffer {
 static size_t rxrpc_fill_out_ack(struct rxrpc_call *call,
                                 struct rxrpc_pkt_buffer *pkt)
 {
+       rxrpc_serial_t serial;
        rxrpc_seq_t hard_ack, top, seq;
        int ix;
        u32 mtu, jmax;
        u8 *ackp = pkt->acks;
 
        /* Barrier against rxrpc_input_data(). */
+       serial = call->ackr_serial;
        hard_ack = READ_ONCE(call->rx_hard_ack);
        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.firstPacket    = htonl(hard_ack + 1);
        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.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.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;