aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-08-30 04:49:29 -0400
committerDavid Howells <dhowells@redhat.com>2016-08-30 11:02:36 -0400
commite34d4234b0b77a8a8b6dd7cf29aff468c288d9e4 (patch)
treec76b81204bb3b7e0294dc688a2f7ff0f970b83ad
parentf5c17aaeb2aee9b6c30d082bbe652a7e5589adff (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.h39
-rw-r--r--net/rxrpc/ar-internal.h19
-rw-r--r--net/rxrpc/call_accept.c5
-rw-r--r--net/rxrpc/call_event.c11
-rw-r--r--net/rxrpc/call_object.c90
-rw-r--r--net/rxrpc/conn_client.c1
-rw-r--r--net/rxrpc/conn_event.c1
-rw-r--r--net/rxrpc/input.c4
-rw-r--r--net/rxrpc/output.c1
-rw-r--r--net/rxrpc/peer_event.c1
-rw-r--r--net/rxrpc/recvmsg.c1
-rw-r--r--net/rxrpc/skbuff.c4
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
19TRACE_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
19TRACE_EVENT(rxrpc_skb, 58TRACE_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 *);
544void rxrpc_release_call(struct rxrpc_call *); 544void rxrpc_release_call(struct rxrpc_call *);
545void rxrpc_release_calls_on_socket(struct rxrpc_sock *); 545void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
546void __rxrpc_put_call(struct rxrpc_call *); 546void rxrpc_see_call(struct rxrpc_call *);
547void rxrpc_get_call(struct rxrpc_call *);
548void rxrpc_put_call(struct rxrpc_call *);
549void rxrpc_get_call_for_skb(struct rxrpc_call *, struct sk_buff *);
550void rxrpc_put_call_for_skb(struct rxrpc_call *, struct sk_buff *);
547void __exit rxrpc_destroy_all_calls(void); 551void __exit rxrpc_destroy_all_calls(void);
548 552
549static inline bool rxrpc_is_service_call(const struct rxrpc_call *call) 553static 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) \
1028do { \
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) \
1035do { \
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 */
444void 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 */
458void 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 */
470void 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 */
436void rxrpc_release_call(struct rxrpc_call *call) 482void 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 */
588void __rxrpc_put_call(struct rxrpc_call *call) 638void 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 */
660void 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