diff options
author | David Howells <dhowells@redhat.com> | 2016-08-30 04:49:29 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-08-30 11:02:36 -0400 |
commit | e34d4234b0b77a8a8b6dd7cf29aff468c288d9e4 (patch) | |
tree | c76b81204bb3b7e0294dc688a2f7ff0f970b83ad | |
parent | f5c17aaeb2aee9b6c30d082bbe652a7e5589adff (diff) |
rxrpc: Trace rxrpc_call usage
Add a trace event for debuging rxrpc_call struct usage.
Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r-- | include/trace/events/rxrpc.h | 39 | ||||
-rw-r--r-- | net/rxrpc/ar-internal.h | 19 | ||||
-rw-r--r-- | net/rxrpc/call_accept.c | 5 | ||||
-rw-r--r-- | net/rxrpc/call_event.c | 11 | ||||
-rw-r--r-- | net/rxrpc/call_object.c | 90 | ||||
-rw-r--r-- | net/rxrpc/conn_client.c | 1 | ||||
-rw-r--r-- | net/rxrpc/conn_event.c | 1 | ||||
-rw-r--r-- | net/rxrpc/input.c | 4 | ||||
-rw-r--r-- | net/rxrpc/output.c | 1 | ||||
-rw-r--r-- | net/rxrpc/peer_event.c | 1 | ||||
-rw-r--r-- | net/rxrpc/recvmsg.c | 1 | ||||
-rw-r--r-- | net/rxrpc/skbuff.c | 4 |
12 files changed, 143 insertions, 34 deletions
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index 15283ee3e41a..cbe574ea674b 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h | |||
@@ -16,6 +16,45 @@ | |||
16 | 16 | ||
17 | #include <linux/tracepoint.h> | 17 | #include <linux/tracepoint.h> |
18 | 18 | ||
19 | TRACE_EVENT(rxrpc_call, | ||
20 | TP_PROTO(struct rxrpc_call *call, int op, int usage, int nskb, | ||
21 | const void *where, const void *aux), | ||
22 | |||
23 | TP_ARGS(call, op, usage, nskb, where, aux), | ||
24 | |||
25 | TP_STRUCT__entry( | ||
26 | __field(struct rxrpc_call *, call ) | ||
27 | __field(int, op ) | ||
28 | __field(int, usage ) | ||
29 | __field(int, nskb ) | ||
30 | __field(const void *, where ) | ||
31 | __field(const void *, aux ) | ||
32 | ), | ||
33 | |||
34 | TP_fast_assign( | ||
35 | __entry->call = call; | ||
36 | __entry->op = op; | ||
37 | __entry->usage = usage; | ||
38 | __entry->nskb = nskb; | ||
39 | __entry->where = where; | ||
40 | __entry->aux = aux; | ||
41 | ), | ||
42 | |||
43 | TP_printk("c=%p %s u=%d s=%d p=%pSR a=%p", | ||
44 | __entry->call, | ||
45 | (__entry->op == 0 ? "NWc" : | ||
46 | __entry->op == 1 ? "NWs" : | ||
47 | __entry->op == 2 ? "SEE" : | ||
48 | __entry->op == 3 ? "GET" : | ||
49 | __entry->op == 4 ? "Gsb" : | ||
50 | __entry->op == 5 ? "PUT" : | ||
51 | "Psb"), | ||
52 | __entry->usage, | ||
53 | __entry->nskb, | ||
54 | __entry->where, | ||
55 | __entry->aux) | ||
56 | ); | ||
57 | |||
19 | TRACE_EVENT(rxrpc_skb, | 58 | TRACE_EVENT(rxrpc_skb, |
20 | TP_PROTO(struct sk_buff *skb, int op, int usage, int mod_count, | 59 | TP_PROTO(struct sk_buff *skb, int op, int usage, int mod_count, |
21 | const void *where), | 60 | const void *where), |
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index ce6afd931e91..0c320b2b7b43 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h | |||
@@ -543,7 +543,11 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *, | |||
543 | struct sk_buff *); | 543 | struct sk_buff *); |
544 | void rxrpc_release_call(struct rxrpc_call *); | 544 | void rxrpc_release_call(struct rxrpc_call *); |
545 | void rxrpc_release_calls_on_socket(struct rxrpc_sock *); | 545 | void rxrpc_release_calls_on_socket(struct rxrpc_sock *); |
546 | void __rxrpc_put_call(struct rxrpc_call *); | 546 | void rxrpc_see_call(struct rxrpc_call *); |
547 | void rxrpc_get_call(struct rxrpc_call *); | ||
548 | void rxrpc_put_call(struct rxrpc_call *); | ||
549 | void rxrpc_get_call_for_skb(struct rxrpc_call *, struct sk_buff *); | ||
550 | void rxrpc_put_call_for_skb(struct rxrpc_call *, struct sk_buff *); | ||
547 | void __exit rxrpc_destroy_all_calls(void); | 551 | void __exit rxrpc_destroy_all_calls(void); |
548 | 552 | ||
549 | static inline bool rxrpc_is_service_call(const struct rxrpc_call *call) | 553 | static inline bool rxrpc_is_service_call(const struct rxrpc_call *call) |
@@ -1022,16 +1026,3 @@ do { \ | |||
1022 | } while (0) | 1026 | } while (0) |
1023 | 1027 | ||
1024 | #endif /* __KDEBUGALL */ | 1028 | #endif /* __KDEBUGALL */ |
1025 | |||
1026 | |||
1027 | #define rxrpc_get_call(CALL) \ | ||
1028 | do { \ | ||
1029 | CHECK_SLAB_OKAY(&(CALL)->usage); \ | ||
1030 | if (atomic_inc_return(&(CALL)->usage) == 1) \ | ||
1031 | BUG(); \ | ||
1032 | } while (0) | ||
1033 | |||
1034 | #define rxrpc_put_call(CALL) \ | ||
1035 | do { \ | ||
1036 | __rxrpc_put_call(CALL); \ | ||
1037 | } while (0) | ||
diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c index ef9ef0d6c917..03af88fe798b 100644 --- a/net/rxrpc/call_accept.c +++ b/net/rxrpc/call_accept.c | |||
@@ -129,8 +129,7 @@ static int rxrpc_accept_incoming_call(struct rxrpc_local *local, | |||
129 | _debug("conn ready"); | 129 | _debug("conn ready"); |
130 | call->state = RXRPC_CALL_SERVER_ACCEPTING; | 130 | call->state = RXRPC_CALL_SERVER_ACCEPTING; |
131 | list_add_tail(&call->accept_link, &rx->acceptq); | 131 | list_add_tail(&call->accept_link, &rx->acceptq); |
132 | rxrpc_get_call(call); | 132 | rxrpc_get_call_for_skb(call, notification); |
133 | atomic_inc(&call->skb_count); | ||
134 | nsp = rxrpc_skb(notification); | 133 | nsp = rxrpc_skb(notification); |
135 | nsp->call = call; | 134 | nsp->call = call; |
136 | 135 | ||
@@ -323,6 +322,7 @@ struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *rx, | |||
323 | call = list_entry(rx->acceptq.next, struct rxrpc_call, accept_link); | 322 | call = list_entry(rx->acceptq.next, struct rxrpc_call, accept_link); |
324 | list_del_init(&call->accept_link); | 323 | list_del_init(&call->accept_link); |
325 | sk_acceptq_removed(&rx->sk); | 324 | sk_acceptq_removed(&rx->sk); |
325 | rxrpc_see_call(call); | ||
326 | 326 | ||
327 | write_lock_bh(&call->state_lock); | 327 | write_lock_bh(&call->state_lock); |
328 | switch (call->state) { | 328 | switch (call->state) { |
@@ -395,6 +395,7 @@ int rxrpc_reject_call(struct rxrpc_sock *rx) | |||
395 | call = list_entry(rx->acceptq.next, struct rxrpc_call, accept_link); | 395 | call = list_entry(rx->acceptq.next, struct rxrpc_call, accept_link); |
396 | list_del_init(&call->accept_link); | 396 | list_del_init(&call->accept_link); |
397 | sk_acceptq_removed(&rx->sk); | 397 | sk_acceptq_removed(&rx->sk); |
398 | rxrpc_see_call(call); | ||
398 | 399 | ||
399 | write_lock_bh(&call->state_lock); | 400 | write_lock_bh(&call->state_lock); |
400 | switch (call->state) { | 401 | switch (call->state) { |
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index 94c7751fd99a..02fe4a4b60d9 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c | |||
@@ -465,8 +465,7 @@ static void rxrpc_insert_oos_packet(struct rxrpc_call *call, | |||
465 | skb->destructor = rxrpc_packet_destructor; | 465 | skb->destructor = rxrpc_packet_destructor; |
466 | ASSERTCMP(sp->call, ==, NULL); | 466 | ASSERTCMP(sp->call, ==, NULL); |
467 | sp->call = call; | 467 | sp->call = call; |
468 | rxrpc_get_call(call); | 468 | rxrpc_get_call_for_skb(call, skb); |
469 | atomic_inc(&call->skb_count); | ||
470 | 469 | ||
471 | /* insert into the buffer in sequence order */ | 470 | /* insert into the buffer in sequence order */ |
472 | spin_lock_bh(&call->lock); | 471 | spin_lock_bh(&call->lock); |
@@ -741,8 +740,7 @@ all_acked: | |||
741 | _debug("post ACK"); | 740 | _debug("post ACK"); |
742 | skb->mark = RXRPC_SKB_MARK_FINAL_ACK; | 741 | skb->mark = RXRPC_SKB_MARK_FINAL_ACK; |
743 | sp->call = call; | 742 | sp->call = call; |
744 | rxrpc_get_call(call); | 743 | rxrpc_get_call_for_skb(call, skb); |
745 | atomic_inc(&call->skb_count); | ||
746 | spin_lock_bh(&call->lock); | 744 | spin_lock_bh(&call->lock); |
747 | if (rxrpc_queue_rcv_skb(call, skb, true, true) < 0) | 745 | if (rxrpc_queue_rcv_skb(call, skb, true, true) < 0) |
748 | BUG(); | 746 | BUG(); |
@@ -801,8 +799,7 @@ static int rxrpc_post_message(struct rxrpc_call *call, u32 mark, u32 error, | |||
801 | memset(sp, 0, sizeof(*sp)); | 799 | memset(sp, 0, sizeof(*sp)); |
802 | sp->error = error; | 800 | sp->error = error; |
803 | sp->call = call; | 801 | sp->call = call; |
804 | rxrpc_get_call(call); | 802 | rxrpc_get_call_for_skb(call, skb); |
805 | atomic_inc(&call->skb_count); | ||
806 | 803 | ||
807 | spin_lock_bh(&call->lock); | 804 | spin_lock_bh(&call->lock); |
808 | ret = rxrpc_queue_rcv_skb(call, skb, true, fatal); | 805 | ret = rxrpc_queue_rcv_skb(call, skb, true, fatal); |
@@ -834,6 +831,8 @@ void rxrpc_process_call(struct work_struct *work) | |||
834 | u32 serial, abort_code = RX_PROTOCOL_ERROR; | 831 | u32 serial, abort_code = RX_PROTOCOL_ERROR; |
835 | u8 *acks = NULL; | 832 | u8 *acks = NULL; |
836 | 833 | ||
834 | rxrpc_see_call(call); | ||
835 | |||
837 | //printk("\n--------------------\n"); | 836 | //printk("\n--------------------\n"); |
838 | _enter("{%d,%s,%lx} [%lu]", | 837 | _enter("{%d,%s,%lx} [%lu]", |
839 | call->debug_id, rxrpc_call_states[call->state], call->events, | 838 | call->debug_id, rxrpc_call_states[call->state], call->events, |
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c index 852c30dc7b75..104ee8b1de06 100644 --- a/net/rxrpc/call_object.c +++ b/net/rxrpc/call_object.c | |||
@@ -219,6 +219,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, | |||
219 | { | 219 | { |
220 | struct rxrpc_call *call, *xcall; | 220 | struct rxrpc_call *call, *xcall; |
221 | struct rb_node *parent, **pp; | 221 | struct rb_node *parent, **pp; |
222 | const void *here = __builtin_return_address(0); | ||
222 | int ret; | 223 | int ret; |
223 | 224 | ||
224 | _enter("%p,%lx", rx, user_call_ID); | 225 | _enter("%p,%lx", rx, user_call_ID); |
@@ -229,6 +230,9 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx, | |||
229 | return call; | 230 | return call; |
230 | } | 231 | } |
231 | 232 | ||
233 | trace_rxrpc_call(call, 0, atomic_read(&call->usage), 0, here, | ||
234 | (const void *)user_call_ID); | ||
235 | |||
232 | /* Publish the call, even though it is incompletely set up as yet */ | 236 | /* Publish the call, even though it is incompletely set up as yet */ |
233 | call->user_call_ID = user_call_ID; | 237 | call->user_call_ID = user_call_ID; |
234 | __set_bit(RXRPC_CALL_HAS_USERID, &call->flags); | 238 | __set_bit(RXRPC_CALL_HAS_USERID, &call->flags); |
@@ -308,6 +312,7 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *rx, | |||
308 | { | 312 | { |
309 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | 313 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
310 | struct rxrpc_call *call, *candidate; | 314 | struct rxrpc_call *call, *candidate; |
315 | const void *here = __builtin_return_address(0); | ||
311 | u32 call_id, chan; | 316 | u32 call_id, chan; |
312 | 317 | ||
313 | _enter(",%d", conn->debug_id); | 318 | _enter(",%d", conn->debug_id); |
@@ -318,6 +323,9 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *rx, | |||
318 | if (!candidate) | 323 | if (!candidate) |
319 | return ERR_PTR(-EBUSY); | 324 | return ERR_PTR(-EBUSY); |
320 | 325 | ||
326 | trace_rxrpc_call(candidate, 1, atomic_read(&candidate->usage), | ||
327 | 0, here, NULL); | ||
328 | |||
321 | chan = sp->hdr.cid & RXRPC_CHANNELMASK; | 329 | chan = sp->hdr.cid & RXRPC_CHANNELMASK; |
322 | candidate->socket = rx; | 330 | candidate->socket = rx; |
323 | candidate->conn = conn; | 331 | candidate->conn = conn; |
@@ -431,6 +439,44 @@ old_call: | |||
431 | } | 439 | } |
432 | 440 | ||
433 | /* | 441 | /* |
442 | * Note the re-emergence of a call. | ||
443 | */ | ||
444 | void rxrpc_see_call(struct rxrpc_call *call) | ||
445 | { | ||
446 | const void *here = __builtin_return_address(0); | ||
447 | if (call) { | ||
448 | int n = atomic_read(&call->usage); | ||
449 | int m = atomic_read(&call->skb_count); | ||
450 | |||
451 | trace_rxrpc_call(call, 2, n, m, here, 0); | ||
452 | } | ||
453 | } | ||
454 | |||
455 | /* | ||
456 | * Note the addition of a ref on a call. | ||
457 | */ | ||
458 | void rxrpc_get_call(struct rxrpc_call *call) | ||
459 | { | ||
460 | const void *here = __builtin_return_address(0); | ||
461 | int n = atomic_inc_return(&call->usage); | ||
462 | int m = atomic_read(&call->skb_count); | ||
463 | |||
464 | trace_rxrpc_call(call, 3, n, m, here, 0); | ||
465 | } | ||
466 | |||
467 | /* | ||
468 | * Note the addition of a ref on a call for a socket buffer. | ||
469 | */ | ||
470 | void rxrpc_get_call_for_skb(struct rxrpc_call *call, struct sk_buff *skb) | ||
471 | { | ||
472 | const void *here = __builtin_return_address(0); | ||
473 | int n = atomic_inc_return(&call->usage); | ||
474 | int m = atomic_inc_return(&call->skb_count); | ||
475 | |||
476 | trace_rxrpc_call(call, 4, n, m, here, skb); | ||
477 | } | ||
478 | |||
479 | /* | ||
434 | * detach a call from a socket and set up for release | 480 | * detach a call from a socket and set up for release |
435 | */ | 481 | */ |
436 | void rxrpc_release_call(struct rxrpc_call *call) | 482 | void rxrpc_release_call(struct rxrpc_call *call) |
@@ -443,6 +489,8 @@ void rxrpc_release_call(struct rxrpc_call *call) | |||
443 | atomic_read(&call->ackr_not_idle), | 489 | atomic_read(&call->ackr_not_idle), |
444 | call->rx_first_oos); | 490 | call->rx_first_oos); |
445 | 491 | ||
492 | rxrpc_see_call(call); | ||
493 | |||
446 | spin_lock_bh(&call->lock); | 494 | spin_lock_bh(&call->lock); |
447 | if (test_and_set_bit(RXRPC_CALL_RELEASED, &call->flags)) | 495 | if (test_and_set_bit(RXRPC_CALL_RELEASED, &call->flags)) |
448 | BUG(); | 496 | BUG(); |
@@ -526,6 +574,7 @@ static void rxrpc_dead_call_expired(unsigned long _call) | |||
526 | 574 | ||
527 | _enter("{%d}", call->debug_id); | 575 | _enter("{%d}", call->debug_id); |
528 | 576 | ||
577 | rxrpc_see_call(call); | ||
529 | write_lock_bh(&call->state_lock); | 578 | write_lock_bh(&call->state_lock); |
530 | call->state = RXRPC_CALL_DEAD; | 579 | call->state = RXRPC_CALL_DEAD; |
531 | write_unlock_bh(&call->state_lock); | 580 | write_unlock_bh(&call->state_lock); |
@@ -540,6 +589,7 @@ static void rxrpc_mark_call_released(struct rxrpc_call *call) | |||
540 | { | 589 | { |
541 | bool sched; | 590 | bool sched; |
542 | 591 | ||
592 | rxrpc_see_call(call); | ||
543 | write_lock(&call->state_lock); | 593 | write_lock(&call->state_lock); |
544 | if (call->state < RXRPC_CALL_DEAD) { | 594 | if (call->state < RXRPC_CALL_DEAD) { |
545 | sched = __rxrpc_abort_call(call, RX_CALL_DEAD, ECONNRESET); | 595 | sched = __rxrpc_abort_call(call, RX_CALL_DEAD, ECONNRESET); |
@@ -585,21 +635,43 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx) | |||
585 | /* | 635 | /* |
586 | * release a call | 636 | * release a call |
587 | */ | 637 | */ |
588 | void __rxrpc_put_call(struct rxrpc_call *call) | 638 | void rxrpc_put_call(struct rxrpc_call *call) |
589 | { | 639 | { |
590 | ASSERT(call != NULL); | 640 | const void *here = __builtin_return_address(0); |
641 | int n, m; | ||
591 | 642 | ||
592 | _enter("%p{u=%d}", call, atomic_read(&call->usage)); | 643 | ASSERT(call != NULL); |
593 | 644 | ||
594 | ASSERTCMP(atomic_read(&call->usage), >, 0); | 645 | n = atomic_dec_return(&call->usage); |
646 | m = atomic_read(&call->skb_count); | ||
647 | trace_rxrpc_call(call, 5, n, m, here, NULL); | ||
648 | ASSERTCMP(n, >=, 0); | ||
649 | if (n == 0) { | ||
650 | _debug("call %d dead", call->debug_id); | ||
651 | WARN_ON(m != 0); | ||
652 | ASSERTCMP(call->state, ==, RXRPC_CALL_DEAD); | ||
653 | rxrpc_queue_work(&call->destroyer); | ||
654 | } | ||
655 | } | ||
595 | 656 | ||
596 | if (atomic_dec_and_test(&call->usage)) { | 657 | /* |
658 | * Release a call ref held by a socket buffer. | ||
659 | */ | ||
660 | void rxrpc_put_call_for_skb(struct rxrpc_call *call, struct sk_buff *skb) | ||
661 | { | ||
662 | const void *here = __builtin_return_address(0); | ||
663 | int n, m; | ||
664 | |||
665 | n = atomic_dec_return(&call->usage); | ||
666 | m = atomic_dec_return(&call->skb_count); | ||
667 | trace_rxrpc_call(call, 6, n, m, here, skb); | ||
668 | ASSERTCMP(n, >=, 0); | ||
669 | if (n == 0) { | ||
597 | _debug("call %d dead", call->debug_id); | 670 | _debug("call %d dead", call->debug_id); |
598 | WARN_ON(atomic_read(&call->skb_count) != 0); | 671 | WARN_ON(m != 0); |
599 | ASSERTCMP(call->state, ==, RXRPC_CALL_DEAD); | 672 | ASSERTCMP(call->state, ==, RXRPC_CALL_DEAD); |
600 | rxrpc_queue_work(&call->destroyer); | 673 | rxrpc_queue_work(&call->destroyer); |
601 | } | 674 | } |
602 | _leave(""); | ||
603 | } | 675 | } |
604 | 676 | ||
605 | /* | 677 | /* |
@@ -705,6 +777,7 @@ void __exit rxrpc_destroy_all_calls(void) | |||
705 | call = list_entry(rxrpc_calls.next, struct rxrpc_call, link); | 777 | call = list_entry(rxrpc_calls.next, struct rxrpc_call, link); |
706 | _debug("Zapping call %p", call); | 778 | _debug("Zapping call %p", call); |
707 | 779 | ||
780 | rxrpc_see_call(call); | ||
708 | list_del_init(&call->link); | 781 | list_del_init(&call->link); |
709 | 782 | ||
710 | switch (atomic_read(&call->usage)) { | 783 | switch (atomic_read(&call->usage)) { |
@@ -748,6 +821,7 @@ static void rxrpc_call_life_expired(unsigned long _call) | |||
748 | 821 | ||
749 | _enter("{%d}", call->debug_id); | 822 | _enter("{%d}", call->debug_id); |
750 | 823 | ||
824 | rxrpc_see_call(call); | ||
751 | if (call->state >= RXRPC_CALL_COMPLETE) | 825 | if (call->state >= RXRPC_CALL_COMPLETE) |
752 | return; | 826 | return; |
753 | 827 | ||
@@ -765,6 +839,7 @@ static void rxrpc_resend_time_expired(unsigned long _call) | |||
765 | 839 | ||
766 | _enter("{%d}", call->debug_id); | 840 | _enter("{%d}", call->debug_id); |
767 | 841 | ||
842 | rxrpc_see_call(call); | ||
768 | if (call->state >= RXRPC_CALL_COMPLETE) | 843 | if (call->state >= RXRPC_CALL_COMPLETE) |
769 | return; | 844 | return; |
770 | 845 | ||
@@ -782,6 +857,7 @@ static void rxrpc_ack_time_expired(unsigned long _call) | |||
782 | 857 | ||
783 | _enter("{%d}", call->debug_id); | 858 | _enter("{%d}", call->debug_id); |
784 | 859 | ||
860 | rxrpc_see_call(call); | ||
785 | if (call->state >= RXRPC_CALL_COMPLETE) | 861 | if (call->state >= RXRPC_CALL_COMPLETE) |
786 | return; | 862 | return; |
787 | 863 | ||
diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c index 44850a2d90b5..4b213bc0f554 100644 --- a/net/rxrpc/conn_client.c +++ b/net/rxrpc/conn_client.c | |||
@@ -537,6 +537,7 @@ static void rxrpc_activate_one_channel(struct rxrpc_connection *conn, | |||
537 | struct rxrpc_call, chan_wait_link); | 537 | struct rxrpc_call, chan_wait_link); |
538 | u32 call_id = chan->call_counter + 1; | 538 | u32 call_id = chan->call_counter + 1; |
539 | 539 | ||
540 | rxrpc_see_call(call); | ||
540 | list_del_init(&call->chan_wait_link); | 541 | list_del_init(&call->chan_wait_link); |
541 | conn->active_chans |= 1 << channel; | 542 | conn->active_chans |= 1 << channel; |
542 | call->peer = rxrpc_get_peer(conn->params.peer); | 543 | call->peer = rxrpc_get_peer(conn->params.peer); |
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c index bcea99c73b40..bc9b05938ff5 100644 --- a/net/rxrpc/conn_event.c +++ b/net/rxrpc/conn_event.c | |||
@@ -157,6 +157,7 @@ static void rxrpc_abort_calls(struct rxrpc_connection *conn, | |||
157 | conn->channels[i].call, | 157 | conn->channels[i].call, |
158 | lockdep_is_held(&conn->channel_lock)); | 158 | lockdep_is_held(&conn->channel_lock)); |
159 | if (call) { | 159 | if (call) { |
160 | rxrpc_see_call(call); | ||
160 | write_lock_bh(&call->state_lock); | 161 | write_lock_bh(&call->state_lock); |
161 | if (rxrpc_set_call_completion(call, compl, abort_code, | 162 | if (rxrpc_set_call_completion(call, compl, abort_code, |
162 | error)) { | 163 | error)) { |
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index af49c2992c4a..86bea9ad6c3d 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c | |||
@@ -196,8 +196,7 @@ static int rxrpc_fast_process_data(struct rxrpc_call *call, | |||
196 | goto enqueue_packet; | 196 | goto enqueue_packet; |
197 | 197 | ||
198 | sp->call = call; | 198 | sp->call = call; |
199 | rxrpc_get_call(call); | 199 | rxrpc_get_call_for_skb(call, skb); |
200 | atomic_inc(&call->skb_count); | ||
201 | terminal = ((flags & RXRPC_LAST_PACKET) && | 200 | terminal = ((flags & RXRPC_LAST_PACKET) && |
202 | !(flags & RXRPC_CLIENT_INITIATED)); | 201 | !(flags & RXRPC_CLIENT_INITIATED)); |
203 | ret = rxrpc_queue_rcv_skb(call, skb, false, terminal); | 202 | ret = rxrpc_queue_rcv_skb(call, skb, false, terminal); |
@@ -748,6 +747,7 @@ void rxrpc_data_ready(struct sock *sk) | |||
748 | if (!call || atomic_read(&call->usage) == 0) | 747 | if (!call || atomic_read(&call->usage) == 0) |
749 | goto cant_route_call; | 748 | goto cant_route_call; |
750 | 749 | ||
750 | rxrpc_see_call(call); | ||
751 | rxrpc_post_packet_to_call(call, skb); | 751 | rxrpc_post_packet_to_call(call, skb); |
752 | goto out_unlock; | 752 | goto out_unlock; |
753 | } | 753 | } |
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 036e1112b0c5..888fa87ed1d6 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c | |||
@@ -207,6 +207,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) | |||
207 | return PTR_ERR(call); | 207 | return PTR_ERR(call); |
208 | } | 208 | } |
209 | 209 | ||
210 | rxrpc_see_call(call); | ||
210 | _debug("CALL %d USR %lx ST %d on CONN %p", | 211 | _debug("CALL %d USR %lx ST %d on CONN %p", |
211 | call->debug_id, call->user_call_ID, call->state, call->conn); | 212 | call->debug_id, call->user_call_ID, call->state, call->conn); |
212 | 213 | ||
diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c index 865078d76ad3..27b9ecad007e 100644 --- a/net/rxrpc/peer_event.c +++ b/net/rxrpc/peer_event.c | |||
@@ -270,6 +270,7 @@ void rxrpc_peer_error_distributor(struct work_struct *work) | |||
270 | call = hlist_entry(peer->error_targets.first, | 270 | call = hlist_entry(peer->error_targets.first, |
271 | struct rxrpc_call, error_link); | 271 | struct rxrpc_call, error_link); |
272 | hlist_del_init(&call->error_link); | 272 | hlist_del_init(&call->error_link); |
273 | rxrpc_see_call(call); | ||
273 | 274 | ||
274 | queue = false; | 275 | queue = false; |
275 | write_lock(&call->state_lock); | 276 | write_lock(&call->state_lock); |
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c index 96d98a3a7087..c9b38c7fb448 100644 --- a/net/rxrpc/recvmsg.c +++ b/net/rxrpc/recvmsg.c | |||
@@ -115,6 +115,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, | |||
115 | sp = rxrpc_skb(skb); | 115 | sp = rxrpc_skb(skb); |
116 | call = sp->call; | 116 | call = sp->call; |
117 | ASSERT(call != NULL); | 117 | ASSERT(call != NULL); |
118 | rxrpc_see_call(call); | ||
118 | 119 | ||
119 | _debug("next pkt %s", rxrpc_pkts[sp->hdr.type]); | 120 | _debug("next pkt %s", rxrpc_pkts[sp->hdr.type]); |
120 | 121 | ||
diff --git a/net/rxrpc/skbuff.c b/net/rxrpc/skbuff.c index fbd8c74d9505..20529205bb8c 100644 --- a/net/rxrpc/skbuff.c +++ b/net/rxrpc/skbuff.c | |||
@@ -140,9 +140,7 @@ void rxrpc_packet_destructor(struct sk_buff *skb) | |||
140 | _enter("%p{%p}", skb, call); | 140 | _enter("%p{%p}", skb, call); |
141 | 141 | ||
142 | if (call) { | 142 | if (call) { |
143 | if (atomic_dec_return(&call->skb_count) < 0) | 143 | rxrpc_put_call_for_skb(call, skb); |
144 | BUG(); | ||
145 | rxrpc_put_call(call); | ||
146 | sp->call = NULL; | 144 | sp->call = NULL; |
147 | } | 145 | } |
148 | 146 | ||