aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-09-07 09:34:21 -0400
committerDavid Howells <dhowells@redhat.com>2016-09-07 10:30:22 -0400
commitfff72429c2e83bdbe32dc7f1ad6398dfe50750c6 (patch)
tree3b905c48f05baada1309ebcba5d3ba0dbee9e83f
parente796cb419237f54b96442ae7feca1859c693865c (diff)
rxrpc: Improve the call tracking tracepoint
Improve the call tracking tracepoint by showing more differentiation between some of the put and get events, including: (1) Getting and putting refs for the socket call user ID tree. (2) Getting and putting refs for queueing and failing to queue the call processor work item. Note that these aren't necessarily used in this patch, but will be taken advantage of in future patches. An enum is added for the event subtype numbers rather than coding them directly as decimal numbers and a table of 3-letter strings is provided rather than a sequence of ?: operators. Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r--include/trace/events/rxrpc.h11
-rw-r--r--net/rxrpc/af_rxrpc.c2
-rw-r--r--net/rxrpc/ar-internal.h22
-rw-r--r--net/rxrpc/call_accept.c10
-rw-r--r--net/rxrpc/call_event.c2
-rw-r--r--net/rxrpc/call_object.c48
-rw-r--r--net/rxrpc/input.c6
-rw-r--r--net/rxrpc/recvmsg.c23
-rw-r--r--net/rxrpc/sendmsg.c4
-rw-r--r--net/rxrpc/skbuff.c2
10 files changed, 79 insertions, 51 deletions
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
index cbe574ea674b..30164896f1f6 100644
--- a/include/trace/events/rxrpc.h
+++ b/include/trace/events/rxrpc.h
@@ -17,7 +17,8 @@
17#include <linux/tracepoint.h> 17#include <linux/tracepoint.h>
18 18
19TRACE_EVENT(rxrpc_call, 19TRACE_EVENT(rxrpc_call,
20 TP_PROTO(struct rxrpc_call *call, int op, int usage, int nskb, 20 TP_PROTO(struct rxrpc_call *call, enum rxrpc_call_trace op,
21 int usage, int nskb,
21 const void *where, const void *aux), 22 const void *where, const void *aux),
22 23
23 TP_ARGS(call, op, usage, nskb, where, aux), 24 TP_ARGS(call, op, usage, nskb, where, aux),
@@ -42,13 +43,7 @@ TRACE_EVENT(rxrpc_call,
42 43
43 TP_printk("c=%p %s u=%d s=%d p=%pSR a=%p", 44 TP_printk("c=%p %s u=%d s=%d p=%pSR a=%p",
44 __entry->call, 45 __entry->call,
45 (__entry->op == 0 ? "NWc" : 46 rxrpc_call_traces[__entry->op],
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, 47 __entry->usage,
53 __entry->nskb, 48 __entry->nskb,
54 __entry->where, 49 __entry->where,
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c
index b66a9e6f8d04..8356cd003d51 100644
--- a/net/rxrpc/af_rxrpc.c
+++ b/net/rxrpc/af_rxrpc.c
@@ -296,7 +296,7 @@ void rxrpc_kernel_end_call(struct socket *sock, struct rxrpc_call *call)
296 _enter("%d{%d}", call->debug_id, atomic_read(&call->usage)); 296 _enter("%d{%d}", call->debug_id, atomic_read(&call->usage));
297 rxrpc_remove_user_ID(rxrpc_sk(sock->sk), call); 297 rxrpc_remove_user_ID(rxrpc_sk(sock->sk), call);
298 rxrpc_purge_queue(&call->knlrecv_queue); 298 rxrpc_purge_queue(&call->knlrecv_queue);
299 rxrpc_put_call(call); 299 rxrpc_put_call(call, rxrpc_call_put);
300} 300}
301EXPORT_SYMBOL(rxrpc_kernel_end_call); 301EXPORT_SYMBOL(rxrpc_kernel_end_call);
302 302
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index ad702f9f8d1f..913255a53564 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -508,6 +508,24 @@ struct rxrpc_call {
508 unsigned long ackr_window[RXRPC_ACKR_WINDOW_ASZ + 1]; 508 unsigned long ackr_window[RXRPC_ACKR_WINDOW_ASZ + 1];
509}; 509};
510 510
511enum rxrpc_call_trace {
512 rxrpc_call_new_client,
513 rxrpc_call_new_service,
514 rxrpc_call_queued,
515 rxrpc_call_queued_ref,
516 rxrpc_call_seen,
517 rxrpc_call_got,
518 rxrpc_call_got_skb,
519 rxrpc_call_got_userid,
520 rxrpc_call_put,
521 rxrpc_call_put_skb,
522 rxrpc_call_put_userid,
523 rxrpc_call_put_noqueue,
524 rxrpc_call__nr_trace
525};
526
527extern const char rxrpc_call_traces[rxrpc_call__nr_trace][4];
528
511#include <trace/events/rxrpc.h> 529#include <trace/events/rxrpc.h>
512 530
513/* 531/*
@@ -555,8 +573,8 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *,
555void rxrpc_release_call(struct rxrpc_call *); 573void rxrpc_release_call(struct rxrpc_call *);
556void rxrpc_release_calls_on_socket(struct rxrpc_sock *); 574void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
557void rxrpc_see_call(struct rxrpc_call *); 575void rxrpc_see_call(struct rxrpc_call *);
558void rxrpc_get_call(struct rxrpc_call *); 576void rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace);
559void rxrpc_put_call(struct rxrpc_call *); 577void rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace);
560void rxrpc_get_call_for_skb(struct rxrpc_call *, struct sk_buff *); 578void rxrpc_get_call_for_skb(struct rxrpc_call *, struct sk_buff *);
561void rxrpc_put_call_for_skb(struct rxrpc_call *, struct sk_buff *); 579void rxrpc_put_call_for_skb(struct rxrpc_call *, struct sk_buff *);
562void __exit rxrpc_destroy_all_calls(void); 580void __exit rxrpc_destroy_all_calls(void);
diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c
index 68a439e30df1..487ae7aa86db 100644
--- a/net/rxrpc/call_accept.c
+++ b/net/rxrpc/call_accept.c
@@ -115,7 +115,7 @@ static int rxrpc_accept_incoming_call(struct rxrpc_local *local,
115 115
116 write_lock(&rx->call_lock); 116 write_lock(&rx->call_lock);
117 if (!test_and_set_bit(RXRPC_CALL_INIT_ACCEPT, &call->flags)) { 117 if (!test_and_set_bit(RXRPC_CALL_INIT_ACCEPT, &call->flags)) {
118 rxrpc_get_call(call); 118 rxrpc_get_call(call, rxrpc_call_got);
119 119
120 spin_lock(&call->conn->state_lock); 120 spin_lock(&call->conn->state_lock);
121 if (sp->hdr.securityIndex > 0 && 121 if (sp->hdr.securityIndex > 0 &&
@@ -155,7 +155,7 @@ static int rxrpc_accept_incoming_call(struct rxrpc_local *local,
155 _debug("done"); 155 _debug("done");
156 read_unlock_bh(&local->services_lock); 156 read_unlock_bh(&local->services_lock);
157 rxrpc_free_skb(notification); 157 rxrpc_free_skb(notification);
158 rxrpc_put_call(call); 158 rxrpc_put_call(call, rxrpc_call_put);
159 _leave(" = 0"); 159 _leave(" = 0");
160 return 0; 160 return 0;
161 161
@@ -166,11 +166,11 @@ invalid_service:
166 read_lock_bh(&call->state_lock); 166 read_lock_bh(&call->state_lock);
167 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) && 167 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) &&
168 !test_and_set_bit(RXRPC_CALL_EV_RELEASE, &call->events)) { 168 !test_and_set_bit(RXRPC_CALL_EV_RELEASE, &call->events)) {
169 rxrpc_get_call(call); 169 rxrpc_get_call(call, rxrpc_call_got);
170 rxrpc_queue_call(call); 170 rxrpc_queue_call(call);
171 } 171 }
172 read_unlock_bh(&call->state_lock); 172 read_unlock_bh(&call->state_lock);
173 rxrpc_put_call(call); 173 rxrpc_put_call(call, rxrpc_call_put);
174 ret = -ECONNREFUSED; 174 ret = -ECONNREFUSED;
175error: 175error:
176 rxrpc_free_skb(notification); 176 rxrpc_free_skb(notification);
@@ -341,6 +341,7 @@ struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *rx,
341 } 341 }
342 342
343 /* formalise the acceptance */ 343 /* formalise the acceptance */
344 rxrpc_get_call(call, rxrpc_call_got_userid);
344 call->notify_rx = notify_rx; 345 call->notify_rx = notify_rx;
345 call->user_call_ID = user_call_ID; 346 call->user_call_ID = user_call_ID;
346 rb_link_node(&call->sock_node, parent, pp); 347 rb_link_node(&call->sock_node, parent, pp);
@@ -351,7 +352,6 @@ struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *rx,
351 BUG(); 352 BUG();
352 rxrpc_queue_call(call); 353 rxrpc_queue_call(call);
353 354
354 rxrpc_get_call(call);
355 write_unlock_bh(&call->state_lock); 355 write_unlock_bh(&call->state_lock);
356 write_unlock(&rx->call_lock); 356 write_unlock(&rx->call_lock);
357 _leave(" = %p{%d}", call, call->debug_id); 357 _leave(" = %p{%d}", call, call->debug_id);
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c
index 4754c7fb6242..fee8b6ddb334 100644
--- a/net/rxrpc/call_event.c
+++ b/net/rxrpc/call_event.c
@@ -1246,7 +1246,7 @@ send_message_2:
1246kill_ACKs: 1246kill_ACKs:
1247 del_timer_sync(&call->ack_timer); 1247 del_timer_sync(&call->ack_timer);
1248 if (test_and_clear_bit(RXRPC_CALL_EV_ACK_FINAL, &call->events)) 1248 if (test_and_clear_bit(RXRPC_CALL_EV_ACK_FINAL, &call->events))
1249 rxrpc_put_call(call); 1249 rxrpc_put_call(call, rxrpc_call_put);
1250 clear_bit(RXRPC_CALL_EV_ACK, &call->events); 1250 clear_bit(RXRPC_CALL_EV_ACK, &call->events);
1251 1251
1252maybe_reschedule: 1252maybe_reschedule:
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c
index 65691742199b..3166b5222435 100644
--- a/net/rxrpc/call_object.c
+++ b/net/rxrpc/call_object.c
@@ -55,6 +55,21 @@ const char *const rxrpc_call_completions[NR__RXRPC_CALL_COMPLETIONS] = {
55 [RXRPC_CALL_NETWORK_ERROR] = "NetError", 55 [RXRPC_CALL_NETWORK_ERROR] = "NetError",
56}; 56};
57 57
58const char rxrpc_call_traces[rxrpc_call__nr_trace][4] = {
59 [rxrpc_call_new_client] = "NWc",
60 [rxrpc_call_new_service] = "NWs",
61 [rxrpc_call_queued] = "QUE",
62 [rxrpc_call_queued_ref] = "QUR",
63 [rxrpc_call_seen] = "SEE",
64 [rxrpc_call_got] = "GOT",
65 [rxrpc_call_got_skb] = "Gsk",
66 [rxrpc_call_got_userid] = "Gus",
67 [rxrpc_call_put] = "PUT",
68 [rxrpc_call_put_skb] = "Psk",
69 [rxrpc_call_put_userid] = "Pus",
70 [rxrpc_call_put_noqueue] = "PNQ",
71};
72
58struct kmem_cache *rxrpc_call_jar; 73struct kmem_cache *rxrpc_call_jar;
59LIST_HEAD(rxrpc_calls); 74LIST_HEAD(rxrpc_calls);
60DEFINE_RWLOCK(rxrpc_call_lock); 75DEFINE_RWLOCK(rxrpc_call_lock);
@@ -96,7 +111,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
96 return NULL; 111 return NULL;
97 112
98found_extant_call: 113found_extant_call:
99 rxrpc_get_call(call); 114 rxrpc_get_call(call, rxrpc_call_got);
100 read_unlock(&rx->call_lock); 115 read_unlock(&rx->call_lock);
101 _leave(" = %p [%d]", call, atomic_read(&call->usage)); 116 _leave(" = %p [%d]", call, atomic_read(&call->usage));
102 return call; 117 return call;
@@ -252,8 +267,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
252 goto found_user_ID_now_present; 267 goto found_user_ID_now_present;
253 } 268 }
254 269
255 rxrpc_get_call(call); 270 rxrpc_get_call(call, rxrpc_call_got_userid);
256
257 rb_link_node(&call->sock_node, parent, pp); 271 rb_link_node(&call->sock_node, parent, pp);
258 rb_insert_color(&call->sock_node, &rx->calls); 272 rb_insert_color(&call->sock_node, &rx->calls);
259 write_unlock(&rx->call_lock); 273 write_unlock(&rx->call_lock);
@@ -275,7 +289,7 @@ error:
275 write_lock(&rx->call_lock); 289 write_lock(&rx->call_lock);
276 rb_erase(&call->sock_node, &rx->calls); 290 rb_erase(&call->sock_node, &rx->calls);
277 write_unlock(&rx->call_lock); 291 write_unlock(&rx->call_lock);
278 rxrpc_put_call(call); 292 rxrpc_put_call(call, rxrpc_call_put_userid);
279 293
280 write_lock_bh(&rxrpc_call_lock); 294 write_lock_bh(&rxrpc_call_lock);
281 list_del_init(&call->link); 295 list_del_init(&call->link);
@@ -283,7 +297,7 @@ error:
283 297
284 set_bit(RXRPC_CALL_RELEASED, &call->flags); 298 set_bit(RXRPC_CALL_RELEASED, &call->flags);
285 call->state = RXRPC_CALL_DEAD; 299 call->state = RXRPC_CALL_DEAD;
286 rxrpc_put_call(call); 300 rxrpc_put_call(call, rxrpc_call_put);
287 _leave(" = %d", ret); 301 _leave(" = %d", ret);
288 return ERR_PTR(ret); 302 return ERR_PTR(ret);
289 303
@@ -296,7 +310,7 @@ found_user_ID_now_present:
296 write_unlock(&rx->call_lock); 310 write_unlock(&rx->call_lock);
297 set_bit(RXRPC_CALL_RELEASED, &call->flags); 311 set_bit(RXRPC_CALL_RELEASED, &call->flags);
298 call->state = RXRPC_CALL_DEAD; 312 call->state = RXRPC_CALL_DEAD;
299 rxrpc_put_call(call); 313 rxrpc_put_call(call, rxrpc_call_put);
300 _leave(" = -EEXIST [%p]", call); 314 _leave(" = -EEXIST [%p]", call);
301 return ERR_PTR(-EEXIST); 315 return ERR_PTR(-EEXIST);
302} 316}
@@ -322,8 +336,8 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *rx,
322 if (!candidate) 336 if (!candidate)
323 return ERR_PTR(-EBUSY); 337 return ERR_PTR(-EBUSY);
324 338
325 trace_rxrpc_call(candidate, 1, atomic_read(&candidate->usage), 339 trace_rxrpc_call(candidate, rxrpc_call_new_service,
326 0, here, NULL); 340 atomic_read(&candidate->usage), 0, here, NULL);
327 341
328 chan = sp->hdr.cid & RXRPC_CHANNELMASK; 342 chan = sp->hdr.cid & RXRPC_CHANNELMASK;
329 candidate->socket = rx; 343 candidate->socket = rx;
@@ -358,7 +372,7 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *rx,
358 read_unlock(&call->state_lock); 372 read_unlock(&call->state_lock);
359 goto aborted_call; 373 goto aborted_call;
360 default: 374 default:
361 rxrpc_get_call(call); 375 rxrpc_get_call(call, rxrpc_call_got);
362 read_unlock(&call->state_lock); 376 read_unlock(&call->state_lock);
363 goto extant_call; 377 goto extant_call;
364 } 378 }
@@ -447,20 +461,20 @@ void rxrpc_see_call(struct rxrpc_call *call)
447 int n = atomic_read(&call->usage); 461 int n = atomic_read(&call->usage);
448 int m = atomic_read(&call->skb_count); 462 int m = atomic_read(&call->skb_count);
449 463
450 trace_rxrpc_call(call, 2, n, m, here, 0); 464 trace_rxrpc_call(call, rxrpc_call_seen, n, m, here, NULL);
451 } 465 }
452} 466}
453 467
454/* 468/*
455 * Note the addition of a ref on a call. 469 * Note the addition of a ref on a call.
456 */ 470 */
457void rxrpc_get_call(struct rxrpc_call *call) 471void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
458{ 472{
459 const void *here = __builtin_return_address(0); 473 const void *here = __builtin_return_address(0);
460 int n = atomic_inc_return(&call->usage); 474 int n = atomic_inc_return(&call->usage);
461 int m = atomic_read(&call->skb_count); 475 int m = atomic_read(&call->skb_count);
462 476
463 trace_rxrpc_call(call, 3, n, m, here, 0); 477 trace_rxrpc_call(call, op, n, m, here, NULL);
464} 478}
465 479
466/* 480/*
@@ -472,7 +486,7 @@ void rxrpc_get_call_for_skb(struct rxrpc_call *call, struct sk_buff *skb)
472 int n = atomic_inc_return(&call->usage); 486 int n = atomic_inc_return(&call->usage);
473 int m = atomic_inc_return(&call->skb_count); 487 int m = atomic_inc_return(&call->skb_count);
474 488
475 trace_rxrpc_call(call, 4, n, m, here, skb); 489 trace_rxrpc_call(call, rxrpc_call_got_skb, n, m, here, skb);
476} 490}
477 491
478/* 492/*
@@ -575,7 +589,7 @@ static void rxrpc_dead_call_expired(unsigned long _call)
575 write_lock_bh(&call->state_lock); 589 write_lock_bh(&call->state_lock);
576 call->state = RXRPC_CALL_DEAD; 590 call->state = RXRPC_CALL_DEAD;
577 write_unlock_bh(&call->state_lock); 591 write_unlock_bh(&call->state_lock);
578 rxrpc_put_call(call); 592 rxrpc_put_call(call, rxrpc_call_put);
579} 593}
580 594
581/* 595/*
@@ -632,7 +646,7 @@ void rxrpc_release_calls_on_socket(struct rxrpc_sock *rx)
632/* 646/*
633 * release a call 647 * release a call
634 */ 648 */
635void rxrpc_put_call(struct rxrpc_call *call) 649void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
636{ 650{
637 const void *here = __builtin_return_address(0); 651 const void *here = __builtin_return_address(0);
638 int n, m; 652 int n, m;
@@ -641,7 +655,7 @@ void rxrpc_put_call(struct rxrpc_call *call)
641 655
642 n = atomic_dec_return(&call->usage); 656 n = atomic_dec_return(&call->usage);
643 m = atomic_read(&call->skb_count); 657 m = atomic_read(&call->skb_count);
644 trace_rxrpc_call(call, 5, n, m, here, NULL); 658 trace_rxrpc_call(call, op, n, m, here, NULL);
645 ASSERTCMP(n, >=, 0); 659 ASSERTCMP(n, >=, 0);
646 if (n == 0) { 660 if (n == 0) {
647 _debug("call %d dead", call->debug_id); 661 _debug("call %d dead", call->debug_id);
@@ -661,7 +675,7 @@ void rxrpc_put_call_for_skb(struct rxrpc_call *call, struct sk_buff *skb)
661 675
662 n = atomic_dec_return(&call->usage); 676 n = atomic_dec_return(&call->usage);
663 m = atomic_dec_return(&call->skb_count); 677 m = atomic_dec_return(&call->skb_count);
664 trace_rxrpc_call(call, 6, n, m, here, skb); 678 trace_rxrpc_call(call, rxrpc_call_put_skb, n, m, here, skb);
665 ASSERTCMP(n, >=, 0); 679 ASSERTCMP(n, >=, 0);
666 if (n == 0) { 680 if (n == 0) {
667 _debug("call %d dead", call->debug_id); 681 _debug("call %d dead", call->debug_id);
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
index 72f016cfaaf5..f7239a6f9181 100644
--- a/net/rxrpc/input.c
+++ b/net/rxrpc/input.c
@@ -537,7 +537,7 @@ static void rxrpc_post_packet_to_call(struct rxrpc_call *call,
537 } 537 }
538 538
539 read_unlock(&call->state_lock); 539 read_unlock(&call->state_lock);
540 rxrpc_get_call(call); 540 rxrpc_get_call(call, rxrpc_call_got);
541 541
542 if (sp->hdr.type == RXRPC_PACKET_TYPE_DATA && 542 if (sp->hdr.type == RXRPC_PACKET_TYPE_DATA &&
543 sp->hdr.flags & RXRPC_JUMBO_PACKET) 543 sp->hdr.flags & RXRPC_JUMBO_PACKET)
@@ -545,12 +545,12 @@ static void rxrpc_post_packet_to_call(struct rxrpc_call *call,
545 else 545 else
546 rxrpc_fast_process_packet(call, skb); 546 rxrpc_fast_process_packet(call, skb);
547 547
548 rxrpc_put_call(call); 548 rxrpc_put_call(call, rxrpc_call_put);
549 goto done; 549 goto done;
550 550
551resend_final_ack: 551resend_final_ack:
552 _debug("final ack again"); 552 _debug("final ack again");
553 rxrpc_get_call(call); 553 rxrpc_get_call(call, rxrpc_call_got);
554 set_bit(RXRPC_CALL_EV_ACK_FINAL, &call->events); 554 set_bit(RXRPC_CALL_EV_ACK_FINAL, &call->events);
555 rxrpc_queue_call(call); 555 rxrpc_queue_call(call);
556 goto free_unlock; 556 goto free_unlock;
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
index 0ab7b334bab1..97f8ee76c67c 100644
--- a/net/rxrpc/recvmsg.c
+++ b/net/rxrpc/recvmsg.c
@@ -79,7 +79,8 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
79 if (rx->sk.sk_state != RXRPC_SERVER_LISTENING) { 79 if (rx->sk.sk_state != RXRPC_SERVER_LISTENING) {
80 release_sock(&rx->sk); 80 release_sock(&rx->sk);
81 if (continue_call) 81 if (continue_call)
82 rxrpc_put_call(continue_call); 82 rxrpc_put_call(continue_call,
83 rxrpc_call_put);
83 return -ENODATA; 84 return -ENODATA;
84 } 85 }
85 } 86 }
@@ -137,13 +138,13 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
137 if (call != continue_call || 138 if (call != continue_call ||
138 skb->mark != RXRPC_SKB_MARK_DATA) { 139 skb->mark != RXRPC_SKB_MARK_DATA) {
139 release_sock(&rx->sk); 140 release_sock(&rx->sk);
140 rxrpc_put_call(continue_call); 141 rxrpc_put_call(continue_call, rxrpc_call_put);
141 _leave(" = %d [noncont]", copied); 142 _leave(" = %d [noncont]", copied);
142 return copied; 143 return copied;
143 } 144 }
144 } 145 }
145 146
146 rxrpc_get_call(call); 147 rxrpc_get_call(call, rxrpc_call_got);
147 148
148 /* copy the peer address and timestamp */ 149 /* copy the peer address and timestamp */
149 if (!continue_call) { 150 if (!continue_call) {
@@ -233,7 +234,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
233 if (!continue_call) 234 if (!continue_call)
234 continue_call = sp->call; 235 continue_call = sp->call;
235 else 236 else
236 rxrpc_put_call(call); 237 rxrpc_put_call(call, rxrpc_call_put);
237 call = NULL; 238 call = NULL;
238 239
239 if (flags & MSG_PEEK) { 240 if (flags & MSG_PEEK) {
@@ -255,9 +256,9 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
255out: 256out:
256 release_sock(&rx->sk); 257 release_sock(&rx->sk);
257 if (call) 258 if (call)
258 rxrpc_put_call(call); 259 rxrpc_put_call(call, rxrpc_call_put);
259 if (continue_call) 260 if (continue_call)
260 rxrpc_put_call(continue_call); 261 rxrpc_put_call(continue_call, rxrpc_call_put);
261 _leave(" = %d [data]", copied); 262 _leave(" = %d [data]", copied);
262 return copied; 263 return copied;
263 264
@@ -341,18 +342,18 @@ terminal_message:
341 } 342 }
342 343
343 release_sock(&rx->sk); 344 release_sock(&rx->sk);
344 rxrpc_put_call(call); 345 rxrpc_put_call(call, rxrpc_call_put);
345 if (continue_call) 346 if (continue_call)
346 rxrpc_put_call(continue_call); 347 rxrpc_put_call(continue_call, rxrpc_call_put);
347 _leave(" = %d", ret); 348 _leave(" = %d", ret);
348 return ret; 349 return ret;
349 350
350copy_error: 351copy_error:
351 _debug("copy error"); 352 _debug("copy error");
352 release_sock(&rx->sk); 353 release_sock(&rx->sk);
353 rxrpc_put_call(call); 354 rxrpc_put_call(call, rxrpc_call_put);
354 if (continue_call) 355 if (continue_call)
355 rxrpc_put_call(continue_call); 356 rxrpc_put_call(continue_call, rxrpc_call_put);
356 _leave(" = %d", ret); 357 _leave(" = %d", ret);
357 return ret; 358 return ret;
358 359
@@ -361,7 +362,7 @@ wait_interrupted:
361wait_error: 362wait_error:
362 finish_wait(sk_sleep(&rx->sk), &wait); 363 finish_wait(sk_sleep(&rx->sk), &wait);
363 if (continue_call) 364 if (continue_call)
364 rxrpc_put_call(continue_call); 365 rxrpc_put_call(continue_call, rxrpc_call_put);
365 if (copied) 366 if (copied)
366 copied = ret; 367 copied = ret;
367 _leave(" = %d [waitfail %d]", copied, ret); 368 _leave(" = %d [waitfail %d]", copied, ret);
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c
index 7376794a0308..803078bea507 100644
--- a/net/rxrpc/sendmsg.c
+++ b/net/rxrpc/sendmsg.c
@@ -534,7 +534,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
534 call = rxrpc_accept_call(rx, user_call_ID, NULL); 534 call = rxrpc_accept_call(rx, user_call_ID, NULL);
535 if (IS_ERR(call)) 535 if (IS_ERR(call))
536 return PTR_ERR(call); 536 return PTR_ERR(call);
537 rxrpc_put_call(call); 537 rxrpc_put_call(call, rxrpc_call_put);
538 return 0; 538 return 0;
539 } 539 }
540 540
@@ -573,7 +573,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
573 ret = rxrpc_send_data(rx, call, msg, len); 573 ret = rxrpc_send_data(rx, call, msg, len);
574 } 574 }
575 575
576 rxrpc_put_call(call); 576 rxrpc_put_call(call, rxrpc_call_put);
577 _leave(" = %d", ret); 577 _leave(" = %d", ret);
578 return ret; 578 return ret;
579} 579}
diff --git a/net/rxrpc/skbuff.c b/net/rxrpc/skbuff.c
index a546a2ba6341..c0613ab6d2d5 100644
--- a/net/rxrpc/skbuff.c
+++ b/net/rxrpc/skbuff.c
@@ -35,7 +35,7 @@ static void rxrpc_request_final_ACK(struct rxrpc_call *call)
35 35
36 /* get an extra ref on the call for the final-ACK generator to 36 /* get an extra ref on the call for the final-ACK generator to
37 * release */ 37 * release */
38 rxrpc_get_call(call); 38 rxrpc_get_call(call, rxrpc_call_got);
39 set_bit(RXRPC_CALL_EV_ACK_FINAL, &call->events); 39 set_bit(RXRPC_CALL_EV_ACK_FINAL, &call->events);
40 if (try_to_del_timer_sync(&call->ack_timer) >= 0) 40 if (try_to_del_timer_sync(&call->ack_timer) >= 0)
41 rxrpc_queue_call(call); 41 rxrpc_queue_call(call);