diff options
author | David Howells <dhowells@redhat.com> | 2016-09-17 05:49:13 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-09-17 06:24:03 -0400 |
commit | 58dc63c998ea3c5a27e2bf9251eddbf0977056a6 (patch) | |
tree | 8567efc32e9fb834e90290adcb3ff3a7a1f06610 | |
parent | f3639df2d90bc919328c459b3c7c49ed5667a52f (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.h | 33 | ||||
-rw-r--r-- | net/rxrpc/ar-internal.h | 12 | ||||
-rw-r--r-- | net/rxrpc/call_accept.c | 3 | ||||
-rw-r--r-- | net/rxrpc/input.c | 6 | ||||
-rw-r--r-- | net/rxrpc/misc.c | 9 | ||||
-rw-r--r-- | net/rxrpc/recvmsg.c | 11 |
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 | ||
293 | TRACE_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 | ||
606 | extern const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4]; | 606 | extern const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4]; |
607 | 607 | ||
608 | enum 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 | |||
618 | extern const char rxrpc_receive_traces[rxrpc_receive__nr_trace][4]; | ||
619 | |||
608 | extern const char *const rxrpc_pkts[]; | 620 | extern const char *const rxrpc_pkts[]; |
609 | extern const char *rxrpc_acks(u8 reason); | 621 | extern 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 | |||
145 | const 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 | ||