summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2019-08-19 04:25:38 -0400
committerDavid Howells <dhowells@redhat.com>2019-08-27 05:04:18 -0400
commit987db9f7cd1e77e611b770a569068c43949aa6fd (patch)
tree4f12ded10be28d09c8968552d2dfab684f1a3c3e
parentb311e68420aa52098591988d0d6868b0b7463c0f (diff)
rxrpc: Use the tx-phase skb flag to simplify tracing
Use the previously-added transmit-phase skbuff private flag to simplify the socket buffer tracing a bit. Which phase the skbuff comes from can now be divined from the skb rather than having to be guessed from the call state. We can also reduce the number of rxrpc_skb_trace values by eliminating the difference between Tx and Rx in the symbols. Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r--include/trace/events/rxrpc.h51
-rw-r--r--net/rxrpc/ar-internal.h1
-rw-r--r--net/rxrpc/call_event.c8
-rw-r--r--net/rxrpc/call_object.c6
-rw-r--r--net/rxrpc/conn_event.c6
-rw-r--r--net/rxrpc/input.c22
-rw-r--r--net/rxrpc/local_event.c4
-rw-r--r--net/rxrpc/output.c6
-rw-r--r--net/rxrpc/peer_event.c10
-rw-r--r--net/rxrpc/recvmsg.c6
-rw-r--r--net/rxrpc/sendmsg.c10
-rw-r--r--net/rxrpc/skbuff.c15
12 files changed, 69 insertions, 76 deletions
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
index fa06b528c73c..e2356c51883b 100644
--- a/include/trace/events/rxrpc.h
+++ b/include/trace/events/rxrpc.h
@@ -23,20 +23,15 @@
23#define __RXRPC_DECLARE_TRACE_ENUMS_ONCE_ONLY 23#define __RXRPC_DECLARE_TRACE_ENUMS_ONCE_ONLY
24 24
25enum rxrpc_skb_trace { 25enum rxrpc_skb_trace {
26 rxrpc_skb_rx_cleaned, 26 rxrpc_skb_cleaned,
27 rxrpc_skb_rx_freed, 27 rxrpc_skb_freed,
28 rxrpc_skb_rx_got, 28 rxrpc_skb_got,
29 rxrpc_skb_rx_lost, 29 rxrpc_skb_lost,
30 rxrpc_skb_rx_purged, 30 rxrpc_skb_new,
31 rxrpc_skb_rx_received, 31 rxrpc_skb_purged,
32 rxrpc_skb_rx_rotated, 32 rxrpc_skb_received,
33 rxrpc_skb_rx_seen, 33 rxrpc_skb_rotated,
34 rxrpc_skb_tx_cleaned, 34 rxrpc_skb_seen,
35 rxrpc_skb_tx_freed,
36 rxrpc_skb_tx_got,
37 rxrpc_skb_tx_new,
38 rxrpc_skb_tx_rotated,
39 rxrpc_skb_tx_seen,
40}; 35};
41 36
42enum rxrpc_local_trace { 37enum rxrpc_local_trace {
@@ -228,20 +223,15 @@ enum rxrpc_tx_point {
228 * Declare tracing information enums and their string mappings for display. 223 * Declare tracing information enums and their string mappings for display.
229 */ 224 */
230#define rxrpc_skb_traces \ 225#define rxrpc_skb_traces \
231 EM(rxrpc_skb_rx_cleaned, "Rx CLN") \ 226 EM(rxrpc_skb_cleaned, "CLN") \
232 EM(rxrpc_skb_rx_freed, "Rx FRE") \ 227 EM(rxrpc_skb_freed, "FRE") \
233 EM(rxrpc_skb_rx_got, "Rx GOT") \ 228 EM(rxrpc_skb_got, "GOT") \
234 EM(rxrpc_skb_rx_lost, "Rx *L*") \ 229 EM(rxrpc_skb_lost, "*L*") \
235 EM(rxrpc_skb_rx_purged, "Rx PUR") \ 230 EM(rxrpc_skb_new, "NEW") \
236 EM(rxrpc_skb_rx_received, "Rx RCV") \ 231 EM(rxrpc_skb_purged, "PUR") \
237 EM(rxrpc_skb_rx_rotated, "Rx ROT") \ 232 EM(rxrpc_skb_received, "RCV") \
238 EM(rxrpc_skb_rx_seen, "Rx SEE") \ 233 EM(rxrpc_skb_rotated, "ROT") \
239 EM(rxrpc_skb_tx_cleaned, "Tx CLN") \ 234 E_(rxrpc_skb_seen, "SEE")
240 EM(rxrpc_skb_tx_freed, "Tx FRE") \
241 EM(rxrpc_skb_tx_got, "Tx GOT") \
242 EM(rxrpc_skb_tx_new, "Tx NEW") \
243 EM(rxrpc_skb_tx_rotated, "Tx ROT") \
244 E_(rxrpc_skb_tx_seen, "Tx SEE")
245 235
246#define rxrpc_local_traces \ 236#define rxrpc_local_traces \
247 EM(rxrpc_local_got, "GOT") \ 237 EM(rxrpc_local_got, "GOT") \
@@ -650,6 +640,7 @@ TRACE_EVENT(rxrpc_skb,
650 TP_STRUCT__entry( 640 TP_STRUCT__entry(
651 __field(struct sk_buff *, skb ) 641 __field(struct sk_buff *, skb )
652 __field(enum rxrpc_skb_trace, op ) 642 __field(enum rxrpc_skb_trace, op )
643 __field(u8, flags )
653 __field(int, usage ) 644 __field(int, usage )
654 __field(int, mod_count ) 645 __field(int, mod_count )
655 __field(const void *, where ) 646 __field(const void *, where )
@@ -657,14 +648,16 @@ TRACE_EVENT(rxrpc_skb,
657 648
658 TP_fast_assign( 649 TP_fast_assign(
659 __entry->skb = skb; 650 __entry->skb = skb;
651 __entry->flags = rxrpc_skb(skb)->rx_flags;
660 __entry->op = op; 652 __entry->op = op;
661 __entry->usage = usage; 653 __entry->usage = usage;
662 __entry->mod_count = mod_count; 654 __entry->mod_count = mod_count;
663 __entry->where = where; 655 __entry->where = where;
664 ), 656 ),
665 657
666 TP_printk("s=%p %s u=%d m=%d p=%pSR", 658 TP_printk("s=%p %cx %s u=%d m=%d p=%pSR",
667 __entry->skb, 659 __entry->skb,
660 __entry->flags & RXRPC_SKB_TX_BUFFER ? 'T' : 'R',
668 __print_symbolic(__entry->op, rxrpc_skb_traces), 661 __print_symbolic(__entry->op, rxrpc_skb_traces),
669 __entry->usage, 662 __entry->usage,
670 __entry->mod_count, 663 __entry->mod_count,
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index 63d3a91ce5e9..2d5294f3e62f 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -185,6 +185,7 @@ struct rxrpc_host_header {
185 * - max 48 bytes (struct sk_buff::cb) 185 * - max 48 bytes (struct sk_buff::cb)
186 */ 186 */
187struct rxrpc_skb_priv { 187struct rxrpc_skb_priv {
188 atomic_t nr_ring_pins; /* Number of rxtx ring pins */
188 u8 nr_subpackets; /* Number of subpackets */ 189 u8 nr_subpackets; /* Number of subpackets */
189 u8 rx_flags; /* Received packet flags */ 190 u8 rx_flags; /* Received packet flags */
190#define RXRPC_SKB_INCL_LAST 0x01 /* - Includes last packet */ 191#define RXRPC_SKB_INCL_LAST 0x01 /* - Includes last packet */
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c
index c767679bfa5d..cedbbb3a7c2e 100644
--- a/net/rxrpc/call_event.c
+++ b/net/rxrpc/call_event.c
@@ -199,7 +199,7 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)
199 continue; 199 continue;
200 200
201 skb = call->rxtx_buffer[ix]; 201 skb = call->rxtx_buffer[ix];
202 rxrpc_see_skb(skb, rxrpc_skb_tx_seen); 202 rxrpc_see_skb(skb, rxrpc_skb_seen);
203 203
204 if (anno_type == RXRPC_TX_ANNO_UNACK) { 204 if (anno_type == RXRPC_TX_ANNO_UNACK) {
205 if (ktime_after(skb->tstamp, max_age)) { 205 if (ktime_after(skb->tstamp, max_age)) {
@@ -255,18 +255,18 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)
255 continue; 255 continue;
256 256
257 skb = call->rxtx_buffer[ix]; 257 skb = call->rxtx_buffer[ix];
258 rxrpc_get_skb(skb, rxrpc_skb_tx_got); 258 rxrpc_get_skb(skb, rxrpc_skb_got);
259 spin_unlock_bh(&call->lock); 259 spin_unlock_bh(&call->lock);
260 260
261 if (rxrpc_send_data_packet(call, skb, true) < 0) { 261 if (rxrpc_send_data_packet(call, skb, true) < 0) {
262 rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 262 rxrpc_free_skb(skb, rxrpc_skb_freed);
263 return; 263 return;
264 } 264 }
265 265
266 if (rxrpc_is_client_call(call)) 266 if (rxrpc_is_client_call(call))
267 rxrpc_expose_client_call(call); 267 rxrpc_expose_client_call(call);
268 268
269 rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 269 rxrpc_free_skb(skb, rxrpc_skb_freed);
270 spin_lock_bh(&call->lock); 270 spin_lock_bh(&call->lock);
271 271
272 /* We need to clear the retransmit state, but there are two 272 /* We need to clear the retransmit state, but there are two
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c
index c9ab2da957fe..014548c259ce 100644
--- a/net/rxrpc/call_object.c
+++ b/net/rxrpc/call_object.c
@@ -429,9 +429,7 @@ static void rxrpc_cleanup_ring(struct rxrpc_call *call)
429 int i; 429 int i;
430 430
431 for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) { 431 for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) {
432 rxrpc_free_skb(call->rxtx_buffer[i], 432 rxrpc_free_skb(call->rxtx_buffer[i], rxrpc_skb_cleaned);
433 (call->tx_phase ? rxrpc_skb_tx_cleaned :
434 rxrpc_skb_rx_cleaned));
435 call->rxtx_buffer[i] = NULL; 433 call->rxtx_buffer[i] = NULL;
436 } 434 }
437} 435}
@@ -587,7 +585,7 @@ void rxrpc_cleanup_call(struct rxrpc_call *call)
587 ASSERTCMP(call->conn, ==, NULL); 585 ASSERTCMP(call->conn, ==, NULL);
588 586
589 rxrpc_cleanup_ring(call); 587 rxrpc_cleanup_ring(call);
590 rxrpc_free_skb(call->tx_pending, rxrpc_skb_tx_cleaned); 588 rxrpc_free_skb(call->tx_pending, rxrpc_skb_cleaned);
591 589
592 call_rcu(&call->rcu, rxrpc_rcu_destroy_call); 590 call_rcu(&call->rcu, rxrpc_rcu_destroy_call);
593} 591}
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c
index df6624c140be..a1ceef4f5cd0 100644
--- a/net/rxrpc/conn_event.c
+++ b/net/rxrpc/conn_event.c
@@ -472,7 +472,7 @@ void rxrpc_process_connection(struct work_struct *work)
472 /* go through the conn-level event packets, releasing the ref on this 472 /* go through the conn-level event packets, releasing the ref on this
473 * connection that each one has when we've finished with it */ 473 * connection that each one has when we've finished with it */
474 while ((skb = skb_dequeue(&conn->rx_queue))) { 474 while ((skb = skb_dequeue(&conn->rx_queue))) {
475 rxrpc_see_skb(skb, rxrpc_skb_rx_seen); 475 rxrpc_see_skb(skb, rxrpc_skb_seen);
476 ret = rxrpc_process_event(conn, skb, &abort_code); 476 ret = rxrpc_process_event(conn, skb, &abort_code);
477 switch (ret) { 477 switch (ret) {
478 case -EPROTO: 478 case -EPROTO:
@@ -484,7 +484,7 @@ void rxrpc_process_connection(struct work_struct *work)
484 goto requeue_and_leave; 484 goto requeue_and_leave;
485 case -ECONNABORTED: 485 case -ECONNABORTED:
486 default: 486 default:
487 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 487 rxrpc_free_skb(skb, rxrpc_skb_freed);
488 break; 488 break;
489 } 489 }
490 } 490 }
@@ -501,6 +501,6 @@ requeue_and_leave:
501protocol_error: 501protocol_error:
502 if (rxrpc_abort_connection(conn, ret, abort_code) < 0) 502 if (rxrpc_abort_connection(conn, ret, abort_code) < 0)
503 goto requeue_and_leave; 503 goto requeue_and_leave;
504 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 504 rxrpc_free_skb(skb, rxrpc_skb_freed);
505 goto out; 505 goto out;
506} 506}
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
index 140cede77655..31090bdf1fae 100644
--- a/net/rxrpc/input.c
+++ b/net/rxrpc/input.c
@@ -233,7 +233,7 @@ static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
233 ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK; 233 ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK;
234 skb = call->rxtx_buffer[ix]; 234 skb = call->rxtx_buffer[ix];
235 annotation = call->rxtx_annotations[ix]; 235 annotation = call->rxtx_annotations[ix];
236 rxrpc_see_skb(skb, rxrpc_skb_tx_rotated); 236 rxrpc_see_skb(skb, rxrpc_skb_rotated);
237 call->rxtx_buffer[ix] = NULL; 237 call->rxtx_buffer[ix] = NULL;
238 call->rxtx_annotations[ix] = 0; 238 call->rxtx_annotations[ix] = 0;
239 skb->next = list; 239 skb->next = list;
@@ -258,7 +258,7 @@ static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
258 skb = list; 258 skb = list;
259 list = skb->next; 259 list = skb->next;
260 skb_mark_not_on_list(skb); 260 skb_mark_not_on_list(skb);
261 rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 261 rxrpc_free_skb(skb, rxrpc_skb_freed);
262 } 262 }
263 263
264 return rot_last; 264 return rot_last;
@@ -443,7 +443,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb)
443 443
444 state = READ_ONCE(call->state); 444 state = READ_ONCE(call->state);
445 if (state >= RXRPC_CALL_COMPLETE) { 445 if (state >= RXRPC_CALL_COMPLETE) {
446 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 446 rxrpc_free_skb(skb, rxrpc_skb_freed);
447 return; 447 return;
448 } 448 }
449 449
@@ -559,7 +559,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb)
559 * and also rxrpc_fill_out_ack(). 559 * and also rxrpc_fill_out_ack().
560 */ 560 */
561 if (!terminal) 561 if (!terminal)
562 rxrpc_get_skb(skb, rxrpc_skb_rx_got); 562 rxrpc_get_skb(skb, rxrpc_skb_got);
563 call->rxtx_annotations[ix] = annotation; 563 call->rxtx_annotations[ix] = annotation;
564 smp_wmb(); 564 smp_wmb();
565 call->rxtx_buffer[ix] = skb; 565 call->rxtx_buffer[ix] = skb;
@@ -620,7 +620,7 @@ ack:
620 620
621unlock: 621unlock:
622 spin_unlock(&call->input_lock); 622 spin_unlock(&call->input_lock);
623 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 623 rxrpc_free_skb(skb, rxrpc_skb_freed);
624 _leave(" [queued]"); 624 _leave(" [queued]");
625} 625}
626 626
@@ -1056,7 +1056,7 @@ static void rxrpc_input_call_packet(struct rxrpc_call *call,
1056 break; 1056 break;
1057 } 1057 }
1058 1058
1059 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 1059 rxrpc_free_skb(skb, rxrpc_skb_freed);
1060no_free: 1060no_free:
1061 _leave(""); 1061 _leave("");
1062} 1062}
@@ -1119,7 +1119,7 @@ static void rxrpc_post_packet_to_local(struct rxrpc_local *local,
1119 skb_queue_tail(&local->event_queue, skb); 1119 skb_queue_tail(&local->event_queue, skb);
1120 rxrpc_queue_local(local); 1120 rxrpc_queue_local(local);
1121 } else { 1121 } else {
1122 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 1122 rxrpc_free_skb(skb, rxrpc_skb_freed);
1123 } 1123 }
1124} 1124}
1125 1125
@@ -1134,7 +1134,7 @@ static void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
1134 skb_queue_tail(&local->reject_queue, skb); 1134 skb_queue_tail(&local->reject_queue, skb);
1135 rxrpc_queue_local(local); 1135 rxrpc_queue_local(local);
1136 } else { 1136 } else {
1137 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 1137 rxrpc_free_skb(skb, rxrpc_skb_freed);
1138 } 1138 }
1139} 1139}
1140 1140
@@ -1198,7 +1198,7 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
1198 if (skb->tstamp == 0) 1198 if (skb->tstamp == 0)
1199 skb->tstamp = ktime_get_real(); 1199 skb->tstamp = ktime_get_real();
1200 1200
1201 rxrpc_new_skb(skb, rxrpc_skb_rx_received); 1201 rxrpc_new_skb(skb, rxrpc_skb_received);
1202 1202
1203 skb_pull(skb, sizeof(struct udphdr)); 1203 skb_pull(skb, sizeof(struct udphdr));
1204 1204
@@ -1215,7 +1215,7 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
1215 static int lose; 1215 static int lose;
1216 if ((lose++ & 7) == 7) { 1216 if ((lose++ & 7) == 7) {
1217 trace_rxrpc_rx_lose(sp); 1217 trace_rxrpc_rx_lose(sp);
1218 rxrpc_free_skb(skb, rxrpc_skb_rx_lost); 1218 rxrpc_free_skb(skb, rxrpc_skb_lost);
1219 return 0; 1219 return 0;
1220 } 1220 }
1221 } 1221 }
@@ -1389,7 +1389,7 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
1389 goto out; 1389 goto out;
1390 1390
1391discard: 1391discard:
1392 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 1392 rxrpc_free_skb(skb, rxrpc_skb_freed);
1393out: 1393out:
1394 trace_rxrpc_rx_done(0, 0); 1394 trace_rxrpc_rx_done(0, 0);
1395 return 0; 1395 return 0;
diff --git a/net/rxrpc/local_event.c b/net/rxrpc/local_event.c
index e93a78f7c05e..3ce6d628cd75 100644
--- a/net/rxrpc/local_event.c
+++ b/net/rxrpc/local_event.c
@@ -90,7 +90,7 @@ void rxrpc_process_local_events(struct rxrpc_local *local)
90 if (skb) { 90 if (skb) {
91 struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 91 struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
92 92
93 rxrpc_see_skb(skb, rxrpc_skb_rx_seen); 93 rxrpc_see_skb(skb, rxrpc_skb_seen);
94 _debug("{%d},{%u}", local->debug_id, sp->hdr.type); 94 _debug("{%d},{%u}", local->debug_id, sp->hdr.type);
95 95
96 switch (sp->hdr.type) { 96 switch (sp->hdr.type) {
@@ -108,7 +108,7 @@ void rxrpc_process_local_events(struct rxrpc_local *local)
108 break; 108 break;
109 } 109 }
110 110
111 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 111 rxrpc_free_skb(skb, rxrpc_skb_freed);
112 } 112 }
113 113
114 _leave(""); 114 _leave("");
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c
index 369e516c4bdf..935bb60fff56 100644
--- a/net/rxrpc/output.c
+++ b/net/rxrpc/output.c
@@ -565,7 +565,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
565 memset(&whdr, 0, sizeof(whdr)); 565 memset(&whdr, 0, sizeof(whdr));
566 566
567 while ((skb = skb_dequeue(&local->reject_queue))) { 567 while ((skb = skb_dequeue(&local->reject_queue))) {
568 rxrpc_see_skb(skb, rxrpc_skb_rx_seen); 568 rxrpc_see_skb(skb, rxrpc_skb_seen);
569 sp = rxrpc_skb(skb); 569 sp = rxrpc_skb(skb);
570 570
571 switch (skb->mark) { 571 switch (skb->mark) {
@@ -581,7 +581,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
581 ioc = 2; 581 ioc = 2;
582 break; 582 break;
583 default: 583 default:
584 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 584 rxrpc_free_skb(skb, rxrpc_skb_freed);
585 continue; 585 continue;
586 } 586 }
587 587
@@ -606,7 +606,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
606 rxrpc_tx_point_reject); 606 rxrpc_tx_point_reject);
607 } 607 }
608 608
609 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 609 rxrpc_free_skb(skb, rxrpc_skb_freed);
610 } 610 }
611 611
612 _leave(""); 612 _leave("");
diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c
index 7666ec72d37e..c97ebdc043e4 100644
--- a/net/rxrpc/peer_event.c
+++ b/net/rxrpc/peer_event.c
@@ -163,11 +163,11 @@ void rxrpc_error_report(struct sock *sk)
163 _leave("UDP socket errqueue empty"); 163 _leave("UDP socket errqueue empty");
164 return; 164 return;
165 } 165 }
166 rxrpc_new_skb(skb, rxrpc_skb_rx_received); 166 rxrpc_new_skb(skb, rxrpc_skb_received);
167 serr = SKB_EXT_ERR(skb); 167 serr = SKB_EXT_ERR(skb);
168 if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { 168 if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) {
169 _leave("UDP empty message"); 169 _leave("UDP empty message");
170 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 170 rxrpc_free_skb(skb, rxrpc_skb_freed);
171 return; 171 return;
172 } 172 }
173 173
@@ -177,7 +177,7 @@ void rxrpc_error_report(struct sock *sk)
177 peer = NULL; 177 peer = NULL;
178 if (!peer) { 178 if (!peer) {
179 rcu_read_unlock(); 179 rcu_read_unlock();
180 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 180 rxrpc_free_skb(skb, rxrpc_skb_freed);
181 _leave(" [no peer]"); 181 _leave(" [no peer]");
182 return; 182 return;
183 } 183 }
@@ -189,7 +189,7 @@ void rxrpc_error_report(struct sock *sk)
189 serr->ee.ee_code == ICMP_FRAG_NEEDED)) { 189 serr->ee.ee_code == ICMP_FRAG_NEEDED)) {
190 rxrpc_adjust_mtu(peer, serr); 190 rxrpc_adjust_mtu(peer, serr);
191 rcu_read_unlock(); 191 rcu_read_unlock();
192 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 192 rxrpc_free_skb(skb, rxrpc_skb_freed);
193 rxrpc_put_peer(peer); 193 rxrpc_put_peer(peer);
194 _leave(" [MTU update]"); 194 _leave(" [MTU update]");
195 return; 195 return;
@@ -197,7 +197,7 @@ void rxrpc_error_report(struct sock *sk)
197 197
198 rxrpc_store_error(peer, serr); 198 rxrpc_store_error(peer, serr);
199 rcu_read_unlock(); 199 rcu_read_unlock();
200 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 200 rxrpc_free_skb(skb, rxrpc_skb_freed);
201 rxrpc_put_peer(peer); 201 rxrpc_put_peer(peer);
202 202
203 _leave(""); 203 _leave("");
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
index e49eacfaf4d6..3b0becb12041 100644
--- a/net/rxrpc/recvmsg.c
+++ b/net/rxrpc/recvmsg.c
@@ -190,7 +190,7 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
190 hard_ack++; 190 hard_ack++;
191 ix = hard_ack & RXRPC_RXTX_BUFF_MASK; 191 ix = hard_ack & RXRPC_RXTX_BUFF_MASK;
192 skb = call->rxtx_buffer[ix]; 192 skb = call->rxtx_buffer[ix];
193 rxrpc_see_skb(skb, rxrpc_skb_rx_rotated); 193 rxrpc_see_skb(skb, rxrpc_skb_rotated);
194 sp = rxrpc_skb(skb); 194 sp = rxrpc_skb(skb);
195 195
196 subpacket = call->rxtx_annotations[ix] & RXRPC_RX_ANNO_SUBPACKET; 196 subpacket = call->rxtx_annotations[ix] & RXRPC_RX_ANNO_SUBPACKET;
@@ -205,7 +205,7 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call)
205 /* Barrier against rxrpc_input_data(). */ 205 /* Barrier against rxrpc_input_data(). */
206 smp_store_release(&call->rx_hard_ack, hard_ack); 206 smp_store_release(&call->rx_hard_ack, hard_ack);
207 207
208 rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 208 rxrpc_free_skb(skb, rxrpc_skb_freed);
209 209
210 trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack); 210 trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack);
211 if (last) { 211 if (last) {
@@ -340,7 +340,7 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call,
340 break; 340 break;
341 } 341 }
342 smp_rmb(); 342 smp_rmb();
343 rxrpc_see_skb(skb, rxrpc_skb_rx_seen); 343 rxrpc_see_skb(skb, rxrpc_skb_seen);
344 sp = rxrpc_skb(skb); 344 sp = rxrpc_skb(skb);
345 345
346 if (!(flags & MSG_PEEK)) { 346 if (!(flags & MSG_PEEK)) {
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c
index 472dc3b7d91f..6a1547b270fe 100644
--- a/net/rxrpc/sendmsg.c
+++ b/net/rxrpc/sendmsg.c
@@ -176,7 +176,7 @@ static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
176 skb->tstamp = ktime_get_real(); 176 skb->tstamp = ktime_get_real();
177 177
178 ix = seq & RXRPC_RXTX_BUFF_MASK; 178 ix = seq & RXRPC_RXTX_BUFF_MASK;
179 rxrpc_get_skb(skb, rxrpc_skb_tx_got); 179 rxrpc_get_skb(skb, rxrpc_skb_got);
180 call->rxtx_annotations[ix] = annotation; 180 call->rxtx_annotations[ix] = annotation;
181 smp_wmb(); 181 smp_wmb();
182 call->rxtx_buffer[ix] = skb; 182 call->rxtx_buffer[ix] = skb;
@@ -248,7 +248,7 @@ static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
248 } 248 }
249 249
250out: 250out:
251 rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 251 rxrpc_free_skb(skb, rxrpc_skb_freed);
252 _leave(" = %d", ret); 252 _leave(" = %d", ret);
253 return ret; 253 return ret;
254} 254}
@@ -289,7 +289,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
289 289
290 skb = call->tx_pending; 290 skb = call->tx_pending;
291 call->tx_pending = NULL; 291 call->tx_pending = NULL;
292 rxrpc_see_skb(skb, rxrpc_skb_tx_seen); 292 rxrpc_see_skb(skb, rxrpc_skb_seen);
293 293
294 copied = 0; 294 copied = 0;
295 do { 295 do {
@@ -338,7 +338,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
338 338
339 sp = rxrpc_skb(skb); 339 sp = rxrpc_skb(skb);
340 sp->rx_flags |= RXRPC_SKB_TX_BUFFER; 340 sp->rx_flags |= RXRPC_SKB_TX_BUFFER;
341 rxrpc_new_skb(skb, rxrpc_skb_tx_new); 341 rxrpc_new_skb(skb, rxrpc_skb_new);
342 342
343 _debug("ALLOC SEND %p", skb); 343 _debug("ALLOC SEND %p", skb);
344 344
@@ -440,7 +440,7 @@ out:
440 return ret; 440 return ret;
441 441
442call_terminated: 442call_terminated:
443 rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 443 rxrpc_free_skb(skb, rxrpc_skb_freed);
444 _leave(" = %d", call->error); 444 _leave(" = %d", call->error);
445 return call->error; 445 return call->error;
446 446
diff --git a/net/rxrpc/skbuff.c b/net/rxrpc/skbuff.c
index 9ad5045b7c2f..8e6f45f84b9b 100644
--- a/net/rxrpc/skbuff.c
+++ b/net/rxrpc/skbuff.c
@@ -14,7 +14,8 @@
14#include <net/af_rxrpc.h> 14#include <net/af_rxrpc.h>
15#include "ar-internal.h" 15#include "ar-internal.h"
16 16
17#define select_skb_count(op) (op >= rxrpc_skb_tx_cleaned ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs) 17#define is_tx_skb(skb) (rxrpc_skb(skb)->rx_flags & RXRPC_SKB_TX_BUFFER)
18#define select_skb_count(skb) (is_tx_skb(skb) ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs)
18 19
19/* 20/*
20 * Note the allocation or reception of a socket buffer. 21 * Note the allocation or reception of a socket buffer.
@@ -22,7 +23,7 @@
22void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) 23void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
23{ 24{
24 const void *here = __builtin_return_address(0); 25 const void *here = __builtin_return_address(0);
25 int n = atomic_inc_return(select_skb_count(op)); 26 int n = atomic_inc_return(select_skb_count(skb));
26 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 27 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
27} 28}
28 29
@@ -33,7 +34,7 @@ void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
33{ 34{
34 const void *here = __builtin_return_address(0); 35 const void *here = __builtin_return_address(0);
35 if (skb) { 36 if (skb) {
36 int n = atomic_read(select_skb_count(op)); 37 int n = atomic_read(select_skb_count(skb));
37 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 38 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
38 } 39 }
39} 40}
@@ -44,7 +45,7 @@ void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
44void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) 45void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
45{ 46{
46 const void *here = __builtin_return_address(0); 47 const void *here = __builtin_return_address(0);
47 int n = atomic_inc_return(select_skb_count(op)); 48 int n = atomic_inc_return(select_skb_count(skb));
48 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 49 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
49 skb_get(skb); 50 skb_get(skb);
50} 51}
@@ -58,7 +59,7 @@ void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
58 if (skb) { 59 if (skb) {
59 int n; 60 int n;
60 CHECK_SLAB_OKAY(&skb->users); 61 CHECK_SLAB_OKAY(&skb->users);
61 n = atomic_dec_return(select_skb_count(op)); 62 n = atomic_dec_return(select_skb_count(skb));
62 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 63 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
63 kfree_skb(skb); 64 kfree_skb(skb);
64 } 65 }
@@ -72,8 +73,8 @@ void rxrpc_purge_queue(struct sk_buff_head *list)
72 const void *here = __builtin_return_address(0); 73 const void *here = __builtin_return_address(0);
73 struct sk_buff *skb; 74 struct sk_buff *skb;
74 while ((skb = skb_dequeue((list))) != NULL) { 75 while ((skb = skb_dequeue((list))) != NULL) {
75 int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged)); 76 int n = atomic_dec_return(select_skb_count(skb));
76 trace_rxrpc_skb(skb, rxrpc_skb_rx_purged, 77 trace_rxrpc_skb(skb, rxrpc_skb_purged,
77 refcount_read(&skb->users), n, here); 78 refcount_read(&skb->users), n, here);
78 kfree_skb(skb); 79 kfree_skb(skb);
79 } 80 }