Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+69 -76
+22 -29
include/trace/events/rxrpc.h
··· 23 23 #define __RXRPC_DECLARE_TRACE_ENUMS_ONCE_ONLY 24 24 25 25 enum rxrpc_skb_trace { 26 - rxrpc_skb_rx_cleaned, 27 - rxrpc_skb_rx_freed, 28 - rxrpc_skb_rx_got, 29 - rxrpc_skb_rx_lost, 30 - rxrpc_skb_rx_purged, 31 - rxrpc_skb_rx_received, 32 - rxrpc_skb_rx_rotated, 33 - rxrpc_skb_rx_seen, 34 - rxrpc_skb_tx_cleaned, 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, 26 + rxrpc_skb_cleaned, 27 + rxrpc_skb_freed, 28 + rxrpc_skb_got, 29 + rxrpc_skb_lost, 30 + rxrpc_skb_new, 31 + rxrpc_skb_purged, 32 + rxrpc_skb_received, 33 + rxrpc_skb_rotated, 34 + rxrpc_skb_seen, 40 35 }; 41 36 42 37 enum rxrpc_local_trace { ··· 223 228 * Declare tracing information enums and their string mappings for display. 224 229 */ 225 230 #define rxrpc_skb_traces \ 226 - EM(rxrpc_skb_rx_cleaned, "Rx CLN") \ 227 - EM(rxrpc_skb_rx_freed, "Rx FRE") \ 228 - EM(rxrpc_skb_rx_got, "Rx GOT") \ 229 - EM(rxrpc_skb_rx_lost, "Rx *L*") \ 230 - EM(rxrpc_skb_rx_purged, "Rx PUR") \ 231 - EM(rxrpc_skb_rx_received, "Rx RCV") \ 232 - EM(rxrpc_skb_rx_rotated, "Rx ROT") \ 233 - EM(rxrpc_skb_rx_seen, "Rx SEE") \ 234 - EM(rxrpc_skb_tx_cleaned, "Tx CLN") \ 235 - EM(rxrpc_skb_tx_freed, "Tx FRE") \ 236 - EM(rxrpc_skb_tx_got, "Tx GOT") \ 237 - EM(rxrpc_skb_tx_new, "Tx NEW") \ 238 - EM(rxrpc_skb_tx_rotated, "Tx ROT") \ 239 - E_(rxrpc_skb_tx_seen, "Tx SEE") 231 + EM(rxrpc_skb_cleaned, "CLN") \ 232 + EM(rxrpc_skb_freed, "FRE") \ 233 + EM(rxrpc_skb_got, "GOT") \ 234 + EM(rxrpc_skb_lost, "*L*") \ 235 + EM(rxrpc_skb_new, "NEW") \ 236 + EM(rxrpc_skb_purged, "PUR") \ 237 + EM(rxrpc_skb_received, "RCV") \ 238 + EM(rxrpc_skb_rotated, "ROT") \ 239 + E_(rxrpc_skb_seen, "SEE") 240 240 241 241 #define rxrpc_local_traces \ 242 242 EM(rxrpc_local_got, "GOT") \ ··· 640 650 TP_STRUCT__entry( 641 651 __field(struct sk_buff *, skb ) 642 652 __field(enum rxrpc_skb_trace, op ) 653 + __field(u8, flags ) 643 654 __field(int, usage ) 644 655 __field(int, mod_count ) 645 656 __field(const void *, where ) ··· 648 657 649 658 TP_fast_assign( 650 659 __entry->skb = skb; 660 + __entry->flags = rxrpc_skb(skb)->rx_flags; 651 661 __entry->op = op; 652 662 __entry->usage = usage; 653 663 __entry->mod_count = mod_count; 654 664 __entry->where = where; 655 665 ), 656 666 657 - TP_printk("s=%p %s u=%d m=%d p=%pSR", 667 + TP_printk("s=%p %cx %s u=%d m=%d p=%pSR", 658 668 __entry->skb, 669 + __entry->flags & RXRPC_SKB_TX_BUFFER ? 'T' : 'R', 659 670 __print_symbolic(__entry->op, rxrpc_skb_traces), 660 671 __entry->usage, 661 672 __entry->mod_count,
+1
net/rxrpc/ar-internal.h
··· 185 185 * - max 48 bytes (struct sk_buff::cb) 186 186 */ 187 187 struct rxrpc_skb_priv { 188 + atomic_t nr_ring_pins; /* Number of rxtx ring pins */ 188 189 u8 nr_subpackets; /* Number of subpackets */ 189 190 u8 rx_flags; /* Received packet flags */ 190 191 #define RXRPC_SKB_INCL_LAST 0x01 /* - Includes last packet */
+4 -4
net/rxrpc/call_event.c
··· 199 199 continue; 200 200 201 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 204 if (anno_type == RXRPC_TX_ANNO_UNACK) { 205 205 if (ktime_after(skb->tstamp, max_age)) { ··· 255 255 continue; 256 256 257 257 skb = call->rxtx_buffer[ix]; 258 - rxrpc_get_skb(skb, rxrpc_skb_tx_got); 258 + rxrpc_get_skb(skb, rxrpc_skb_got); 259 259 spin_unlock_bh(&call->lock); 260 260 261 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 263 return; 264 264 } 265 265 266 266 if (rxrpc_is_client_call(call)) 267 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 270 spin_lock_bh(&call->lock); 271 271 272 272 /* We need to clear the retransmit state, but there are two
+2 -4
net/rxrpc/call_object.c
··· 429 429 int i; 430 430 431 431 for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) { 432 - rxrpc_free_skb(call->rxtx_buffer[i], 433 - (call->tx_phase ? rxrpc_skb_tx_cleaned : 434 - rxrpc_skb_rx_cleaned)); 432 + rxrpc_free_skb(call->rxtx_buffer[i], rxrpc_skb_cleaned); 435 433 call->rxtx_buffer[i] = NULL; 436 434 } 437 435 } ··· 585 587 ASSERTCMP(call->conn, ==, NULL); 586 588 587 589 rxrpc_cleanup_ring(call); 588 - rxrpc_free_skb(call->tx_pending, rxrpc_skb_tx_cleaned); 590 + rxrpc_free_skb(call->tx_pending, rxrpc_skb_cleaned); 589 591 590 592 call_rcu(&call->rcu, rxrpc_rcu_destroy_call); 591 593 }
+3 -3
net/rxrpc/conn_event.c
··· 472 472 /* go through the conn-level event packets, releasing the ref on this 473 473 * connection that each one has when we've finished with it */ 474 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 476 ret = rxrpc_process_event(conn, skb, &abort_code); 477 477 switch (ret) { 478 478 case -EPROTO: ··· 484 484 goto requeue_and_leave; 485 485 case -ECONNABORTED: 486 486 default: 487 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 487 + rxrpc_free_skb(skb, rxrpc_skb_freed); 488 488 break; 489 489 } 490 490 } ··· 501 501 protocol_error: 502 502 if (rxrpc_abort_connection(conn, ret, abort_code) < 0) 503 503 goto requeue_and_leave; 504 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 504 + rxrpc_free_skb(skb, rxrpc_skb_freed); 505 505 goto out; 506 506 }
+11 -11
net/rxrpc/input.c
··· 233 233 ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK; 234 234 skb = call->rxtx_buffer[ix]; 235 235 annotation = call->rxtx_annotations[ix]; 236 - rxrpc_see_skb(skb, rxrpc_skb_tx_rotated); 236 + rxrpc_see_skb(skb, rxrpc_skb_rotated); 237 237 call->rxtx_buffer[ix] = NULL; 238 238 call->rxtx_annotations[ix] = 0; 239 239 skb->next = list; ··· 258 258 skb = list; 259 259 list = skb->next; 260 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 264 return rot_last; ··· 443 443 444 444 state = READ_ONCE(call->state); 445 445 if (state >= RXRPC_CALL_COMPLETE) { 446 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 446 + rxrpc_free_skb(skb, rxrpc_skb_freed); 447 447 return; 448 448 } 449 449 ··· 559 559 * and also rxrpc_fill_out_ack(). 560 560 */ 561 561 if (!terminal) 562 - rxrpc_get_skb(skb, rxrpc_skb_rx_got); 562 + rxrpc_get_skb(skb, rxrpc_skb_got); 563 563 call->rxtx_annotations[ix] = annotation; 564 564 smp_wmb(); 565 565 call->rxtx_buffer[ix] = skb; ··· 620 620 621 621 unlock: 622 622 spin_unlock(&call->input_lock); 623 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 623 + rxrpc_free_skb(skb, rxrpc_skb_freed); 624 624 _leave(" [queued]"); 625 625 } 626 626 ··· 1056 1056 break; 1057 1057 } 1058 1058 1059 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 1059 + rxrpc_free_skb(skb, rxrpc_skb_freed); 1060 1060 no_free: 1061 1061 _leave(""); 1062 1062 } ··· 1119 1119 skb_queue_tail(&local->event_queue, skb); 1120 1120 rxrpc_queue_local(local); 1121 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 1134 skb_queue_tail(&local->reject_queue, skb); 1135 1135 rxrpc_queue_local(local); 1136 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 1198 if (skb->tstamp == 0) 1199 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 1203 skb_pull(skb, sizeof(struct udphdr)); 1204 1204 ··· 1215 1215 static int lose; 1216 1216 if ((lose++ & 7) == 7) { 1217 1217 trace_rxrpc_rx_lose(sp); 1218 - rxrpc_free_skb(skb, rxrpc_skb_rx_lost); 1218 + rxrpc_free_skb(skb, rxrpc_skb_lost); 1219 1219 return 0; 1220 1220 } 1221 1221 } ··· 1389 1389 goto out; 1390 1390 1391 1391 discard: 1392 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 1392 + rxrpc_free_skb(skb, rxrpc_skb_freed); 1393 1393 out: 1394 1394 trace_rxrpc_rx_done(0, 0); 1395 1395 return 0;
+2 -2
net/rxrpc/local_event.c
··· 90 90 if (skb) { 91 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 94 _debug("{%d},{%u}", local->debug_id, sp->hdr.type); 95 95 96 96 switch (sp->hdr.type) { ··· 108 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 114 _leave("");
+3 -3
net/rxrpc/output.c
··· 565 565 memset(&whdr, 0, sizeof(whdr)); 566 566 567 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 569 sp = rxrpc_skb(skb); 570 570 571 571 switch (skb->mark) { ··· 581 581 ioc = 2; 582 582 break; 583 583 default: 584 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 584 + rxrpc_free_skb(skb, rxrpc_skb_freed); 585 585 continue; 586 586 } 587 587 ··· 606 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 612 _leave("");
+5 -5
net/rxrpc/peer_event.c
··· 163 163 _leave("UDP socket errqueue empty"); 164 164 return; 165 165 } 166 - rxrpc_new_skb(skb, rxrpc_skb_rx_received); 166 + rxrpc_new_skb(skb, rxrpc_skb_received); 167 167 serr = SKB_EXT_ERR(skb); 168 168 if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { 169 169 _leave("UDP empty message"); 170 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 170 + rxrpc_free_skb(skb, rxrpc_skb_freed); 171 171 return; 172 172 } 173 173 ··· 177 177 peer = NULL; 178 178 if (!peer) { 179 179 rcu_read_unlock(); 180 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 180 + rxrpc_free_skb(skb, rxrpc_skb_freed); 181 181 _leave(" [no peer]"); 182 182 return; 183 183 } ··· 189 189 serr->ee.ee_code == ICMP_FRAG_NEEDED)) { 190 190 rxrpc_adjust_mtu(peer, serr); 191 191 rcu_read_unlock(); 192 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 192 + rxrpc_free_skb(skb, rxrpc_skb_freed); 193 193 rxrpc_put_peer(peer); 194 194 _leave(" [MTU update]"); 195 195 return; ··· 197 197 198 198 rxrpc_store_error(peer, serr); 199 199 rcu_read_unlock(); 200 - rxrpc_free_skb(skb, rxrpc_skb_rx_freed); 200 + rxrpc_free_skb(skb, rxrpc_skb_freed); 201 201 rxrpc_put_peer(peer); 202 202 203 203 _leave("");
+3 -3
net/rxrpc/recvmsg.c
··· 190 190 hard_ack++; 191 191 ix = hard_ack & RXRPC_RXTX_BUFF_MASK; 192 192 skb = call->rxtx_buffer[ix]; 193 - rxrpc_see_skb(skb, rxrpc_skb_rx_rotated); 193 + rxrpc_see_skb(skb, rxrpc_skb_rotated); 194 194 sp = rxrpc_skb(skb); 195 195 196 196 subpacket = call->rxtx_annotations[ix] & RXRPC_RX_ANNO_SUBPACKET; ··· 205 205 /* Barrier against rxrpc_input_data(). */ 206 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 210 trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack); 211 211 if (last) { ··· 340 340 break; 341 341 } 342 342 smp_rmb(); 343 - rxrpc_see_skb(skb, rxrpc_skb_rx_seen); 343 + rxrpc_see_skb(skb, rxrpc_skb_seen); 344 344 sp = rxrpc_skb(skb); 345 345 346 346 if (!(flags & MSG_PEEK)) {
+5 -5
net/rxrpc/sendmsg.c
··· 176 176 skb->tstamp = ktime_get_real(); 177 177 178 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 180 call->rxtx_annotations[ix] = annotation; 181 181 smp_wmb(); 182 182 call->rxtx_buffer[ix] = skb; ··· 248 248 } 249 249 250 250 out: 251 - rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 251 + rxrpc_free_skb(skb, rxrpc_skb_freed); 252 252 _leave(" = %d", ret); 253 253 return ret; 254 254 } ··· 289 289 290 290 skb = call->tx_pending; 291 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 294 copied = 0; 295 295 do { ··· 338 338 339 339 sp = rxrpc_skb(skb); 340 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 343 _debug("ALLOC SEND %p", skb); 344 344 ··· 440 440 return ret; 441 441 442 442 call_terminated: 443 - rxrpc_free_skb(skb, rxrpc_skb_tx_freed); 443 + rxrpc_free_skb(skb, rxrpc_skb_freed); 444 444 _leave(" = %d", call->error); 445 445 return call->error; 446 446
+8 -7
net/rxrpc/skbuff.c
··· 14 14 #include <net/af_rxrpc.h> 15 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 21 * Note the allocation or reception of a socket buffer. ··· 23 22 void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) 24 23 { 25 24 const void *here = __builtin_return_address(0); 26 - int n = atomic_inc_return(select_skb_count(op)); 25 + int n = atomic_inc_return(select_skb_count(skb)); 27 26 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 28 27 } 29 28 ··· 34 33 { 35 34 const void *here = __builtin_return_address(0); 36 35 if (skb) { 37 - int n = atomic_read(select_skb_count(op)); 36 + int n = atomic_read(select_skb_count(skb)); 38 37 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 39 38 } 40 39 } ··· 45 44 void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) 46 45 { 47 46 const void *here = __builtin_return_address(0); 48 - int n = atomic_inc_return(select_skb_count(op)); 47 + int n = atomic_inc_return(select_skb_count(skb)); 49 48 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 50 49 skb_get(skb); 51 50 } ··· 59 58 if (skb) { 60 59 int n; 61 60 CHECK_SLAB_OKAY(&skb->users); 62 - n = atomic_dec_return(select_skb_count(op)); 61 + n = atomic_dec_return(select_skb_count(skb)); 63 62 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); 64 63 kfree_skb(skb); 65 64 } ··· 73 72 const void *here = __builtin_return_address(0); 74 73 struct sk_buff *skb; 75 74 while ((skb = skb_dequeue((list))) != NULL) { 76 - int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged)); 77 - trace_rxrpc_skb(skb, rxrpc_skb_rx_purged, 75 + int n = atomic_dec_return(select_skb_count(skb)); 76 + trace_rxrpc_skb(skb, rxrpc_skb_purged, 78 77 refcount_read(&skb->users), n, here); 79 78 kfree_skb(skb); 80 79 }