aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-09-17 05:49:13 -0400
committerDavid Howells <dhowells@redhat.com>2016-09-17 06:24:03 -0400
commit58dc63c998ea3c5a27e2bf9251eddbf0977056a6 (patch)
tree8567efc32e9fb834e90290adcb3ff3a7a1f06610
parentf3639df2d90bc919328c459b3c7c49ed5667a52f (diff)
rxrpc: Add a tracepoint to follow packets in the Rx buffer
Add a tracepoint to follow the life of packets that get added to a call's receive buffer. Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r--include/trace/events/rxrpc.h33
-rw-r--r--net/rxrpc/ar-internal.h12
-rw-r--r--net/rxrpc/call_accept.c3
-rw-r--r--net/rxrpc/input.c6
-rw-r--r--net/rxrpc/misc.c9
-rw-r--r--net/rxrpc/recvmsg.c11
6 files changed, 73 insertions, 1 deletions
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
index d545d692ae22..7dd5f0188681 100644
--- a/include/trace/events/rxrpc.h
+++ b/include/trace/events/rxrpc.h
@@ -290,6 +290,39 @@ TRACE_EVENT(rxrpc_tx_ack,
290 __entry->n_acks) 290 __entry->n_acks)
291 ); 291 );
292 292
293TRACE_EVENT(rxrpc_receive,
294 TP_PROTO(struct rxrpc_call *call, enum rxrpc_receive_trace why,
295 rxrpc_serial_t serial, rxrpc_seq_t seq),
296
297 TP_ARGS(call, why, serial, seq),
298
299 TP_STRUCT__entry(
300 __field(struct rxrpc_call *, call )
301 __field(enum rxrpc_receive_trace, why )
302 __field(rxrpc_serial_t, serial )
303 __field(rxrpc_seq_t, seq )
304 __field(rxrpc_seq_t, hard_ack )
305 __field(rxrpc_seq_t, top )
306 ),
307
308 TP_fast_assign(
309 __entry->call = call;
310 __entry->why = why;
311 __entry->serial = serial;
312 __entry->seq = seq;
313 __entry->hard_ack = call->rx_hard_ack;
314 __entry->top = call->rx_top;
315 ),
316
317 TP_printk("c=%p %s r=%08x q=%08x w=%08x-%08x",
318 __entry->call,
319 rxrpc_receive_traces[__entry->why],
320 __entry->serial,
321 __entry->seq,
322 __entry->hard_ack,
323 __entry->top)
324 );
325
293#endif /* _TRACE_RXRPC_H */ 326#endif /* _TRACE_RXRPC_H */
294 327
295/* This part must be outside protection */ 328/* This part must be outside protection */
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index afa5dcc05fe0..e5d2f2fb8e41 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -605,6 +605,18 @@ enum rxrpc_transmit_trace {
605 605
606extern const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4]; 606extern const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4];
607 607
608enum rxrpc_receive_trace {
609 rxrpc_receive_incoming,
610 rxrpc_receive_queue,
611 rxrpc_receive_queue_last,
612 rxrpc_receive_front,
613 rxrpc_receive_rotate,
614 rxrpc_receive_end,
615 rxrpc_receive__nr_trace
616};
617
618extern const char rxrpc_receive_traces[rxrpc_receive__nr_trace][4];
619
608extern const char *const rxrpc_pkts[]; 620extern const char *const rxrpc_pkts[];
609extern const char *rxrpc_acks(u8 reason); 621extern const char *rxrpc_acks(u8 reason);
610 622
diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c
index 3e474508ba75..a8d39d7cf42c 100644
--- a/net/rxrpc/call_accept.c
+++ b/net/rxrpc/call_accept.c
@@ -367,6 +367,9 @@ found_service:
367 goto out; 367 goto out;
368 } 368 }
369 369
370 trace_rxrpc_receive(call, rxrpc_receive_incoming,
371 sp->hdr.serial, sp->hdr.seq);
372
370 /* Make the call live. */ 373 /* Make the call live. */
371 rxrpc_incoming_call(rx, call, skb); 374 rxrpc_incoming_call(rx, call, skb);
372 conn = call->conn; 375 conn = call->conn;
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
index 7b18ca124978..b690220533c6 100644
--- a/net/rxrpc/input.c
+++ b/net/rxrpc/input.c
@@ -284,8 +284,12 @@ next_subpacket:
284 call->rxtx_buffer[ix] = skb; 284 call->rxtx_buffer[ix] = skb;
285 if (after(seq, call->rx_top)) 285 if (after(seq, call->rx_top))
286 smp_store_release(&call->rx_top, seq); 286 smp_store_release(&call->rx_top, seq);
287 if (flags & RXRPC_LAST_PACKET) 287 if (flags & RXRPC_LAST_PACKET) {
288 set_bit(RXRPC_CALL_RX_LAST, &call->flags); 288 set_bit(RXRPC_CALL_RX_LAST, &call->flags);
289 trace_rxrpc_receive(call, rxrpc_receive_queue_last, serial, seq);
290 } else {
291 trace_rxrpc_receive(call, rxrpc_receive_queue, serial, seq);
292 }
289 queued = true; 293 queued = true;
290 294
291 if (after_eq(seq, call->rx_expect_next)) { 295 if (after_eq(seq, call->rx_expect_next)) {
diff --git a/net/rxrpc/misc.c b/net/rxrpc/misc.c
index dca89995f03e..db5f1d54fc90 100644
--- a/net/rxrpc/misc.c
+++ b/net/rxrpc/misc.c
@@ -141,3 +141,12 @@ const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4] = {
141 [rxrpc_transmit_rotate] = "ROT", 141 [rxrpc_transmit_rotate] = "ROT",
142 [rxrpc_transmit_end] = "END", 142 [rxrpc_transmit_end] = "END",
143}; 143};
144
145const char rxrpc_receive_traces[rxrpc_receive__nr_trace][4] = {
146 [rxrpc_receive_incoming] = "INC",
147 [rxrpc_receive_queue] = "QUE",
148 [rxrpc_receive_queue_last] = "QLS",
149 [rxrpc_receive_front] = "FRN",
150 [rxrpc_receive_rotate] = "ROT",
151 [rxrpc_receive_end] = "END",
152};
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
index 8b8d7e14f800..22d51087c580 100644
--- a/net/rxrpc/recvmsg.c
+++ b/net/rxrpc/recvmsg.c
@@ -134,6 +134,7 @@ static void rxrpc_end_rx_phase(struct rxrpc_call *call)
134{ 134{
135 _enter("%d,%s", call->debug_id, rxrpc_call_states[call->state]); 135 _enter("%d,%s", call->debug_id, rxrpc_call_states[call->state]);
136 136
137 trace_rxrpc_receive(call, rxrpc_receive_end, 0, call->rx_top);
137 ASSERTCMP(call->rx_hard_ack, ==, call->rx_top); 138 ASSERTCMP(call->rx_hard_ack, ==, call->rx_top);
138 139
139 if (call->state == RXRPC_CALL_CLIENT_RECV_REPLY) { 140 if (call->state == RXRPC_CALL_CLIENT_RECV_REPLY) {
@@ -167,6 +168,7 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
167{ 168{
168 struct rxrpc_skb_priv *sp; 169 struct rxrpc_skb_priv *sp;
169 struct sk_buff *skb; 170 struct sk_buff *skb;
171 rxrpc_serial_t serial;
170 rxrpc_seq_t hard_ack, top; 172 rxrpc_seq_t hard_ack, top;
171 u8 flags; 173 u8 flags;
172 int ix; 174 int ix;
@@ -183,6 +185,10 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
183 rxrpc_see_skb(skb); 185 rxrpc_see_skb(skb);
184 sp = rxrpc_skb(skb); 186 sp = rxrpc_skb(skb);
185 flags = sp->hdr.flags; 187 flags = sp->hdr.flags;
188 serial = sp->hdr.serial;
189 if (call->rxtx_annotations[ix] & RXRPC_RX_ANNO_JUMBO)
190 serial += (call->rxtx_annotations[ix] & RXRPC_RX_ANNO_JUMBO) - 1;
191
186 call->rxtx_buffer[ix] = NULL; 192 call->rxtx_buffer[ix] = NULL;
187 call->rxtx_annotations[ix] = 0; 193 call->rxtx_annotations[ix] = 0;
188 /* Barrier against rxrpc_input_data(). */ 194 /* Barrier against rxrpc_input_data(). */
@@ -191,6 +197,7 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
191 rxrpc_free_skb(skb); 197 rxrpc_free_skb(skb);
192 198
193 _debug("%u,%u,%02x", hard_ack, top, flags); 199 _debug("%u,%u,%02x", hard_ack, top, flags);
200 trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack);
194 if (flags & RXRPC_LAST_PACKET) 201 if (flags & RXRPC_LAST_PACKET)
195 rxrpc_end_rx_phase(call); 202 rxrpc_end_rx_phase(call);
196} 203}
@@ -309,6 +316,10 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call,
309 rxrpc_see_skb(skb); 316 rxrpc_see_skb(skb);
310 sp = rxrpc_skb(skb); 317 sp = rxrpc_skb(skb);
311 318
319 if (!(flags & MSG_PEEK))
320 trace_rxrpc_receive(call, rxrpc_receive_front,
321 sp->hdr.serial, seq);
322
312 if (msg) 323 if (msg)
313 sock_recv_timestamp(msg, sock->sk, skb); 324 sock_recv_timestamp(msg, sock->sk, skb);
314 325