rxrpc_call_error,
        rxrpc_call_got,
        rxrpc_call_got_kernel,
+       rxrpc_call_got_timer,
        rxrpc_call_got_userid,
        rxrpc_call_new_client,
        rxrpc_call_new_service,
        rxrpc_call_put,
        rxrpc_call_put_kernel,
        rxrpc_call_put_noqueue,
+       rxrpc_call_put_notimer,
+       rxrpc_call_put_timer,
        rxrpc_call_put_userid,
        rxrpc_call_queued,
        rxrpc_call_queued_ref,
        EM(rxrpc_call_error,                    "*E*") \
        EM(rxrpc_call_got,                      "GOT") \
        EM(rxrpc_call_got_kernel,               "Gke") \
+       EM(rxrpc_call_got_timer,                "GTM") \
        EM(rxrpc_call_got_userid,               "Gus") \
        EM(rxrpc_call_new_client,               "NWc") \
        EM(rxrpc_call_new_service,              "NWs") \
        EM(rxrpc_call_put,                      "PUT") \
        EM(rxrpc_call_put_kernel,               "Pke") \
-       EM(rxrpc_call_put_noqueue,              "PNQ") \
+       EM(rxrpc_call_put_noqueue,              "PnQ") \
+       EM(rxrpc_call_put_notimer,              "PnT") \
+       EM(rxrpc_call_put_timer,                "PTM") \
        EM(rxrpc_call_put_userid,               "Pus") \
        EM(rxrpc_call_queued,                   "QUE") \
        EM(rxrpc_call_queued_ref,               "QUR") \
 
                       enum rxrpc_propose_ack_trace);
 void rxrpc_process_call(struct work_struct *);
 
-static inline void rxrpc_reduce_call_timer(struct rxrpc_call *call,
-                                          unsigned long expire_at,
-                                          unsigned long now,
-                                          enum rxrpc_timer_trace why)
-{
-       trace_rxrpc_timer(call, why, now);
-       timer_reduce(&call->timer, expire_at);
-}
+void rxrpc_reduce_call_timer(struct rxrpc_call *call,
+                            unsigned long expire_at,
+                            unsigned long now,
+                            enum rxrpc_timer_trace why);
+
+void rxrpc_delete_call_timer(struct rxrpc_call *call);
 
 /*
  * call_object.c
 bool __rxrpc_queue_call(struct rxrpc_call *);
 bool rxrpc_queue_call(struct rxrpc_call *);
 void rxrpc_see_call(struct rxrpc_call *);
+bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op);
 void rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace);
 void rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace);
 void rxrpc_cleanup_call(struct rxrpc_call *);
 
 
        if (call->state < RXRPC_CALL_COMPLETE) {
                trace_rxrpc_timer(call, rxrpc_timer_expired, jiffies);
-               rxrpc_queue_call(call);
+               __rxrpc_queue_call(call);
+       } else {
+               rxrpc_put_call(call, rxrpc_call_put);
+       }
+}
+
+void rxrpc_reduce_call_timer(struct rxrpc_call *call,
+                            unsigned long expire_at,
+                            unsigned long now,
+                            enum rxrpc_timer_trace why)
+{
+       if (rxrpc_try_get_call(call, rxrpc_call_got_timer)) {
+               trace_rxrpc_timer(call, why, now);
+               if (timer_reduce(&call->timer, expire_at))
+                       rxrpc_put_call(call, rxrpc_call_put_notimer);
        }
 }
 
+void rxrpc_delete_call_timer(struct rxrpc_call *call)
+{
+       if (del_timer_sync(&call->timer))
+               rxrpc_put_call(call, rxrpc_call_put_timer);
+}
+
 static struct lock_class_key rxrpc_call_user_mutex_lock_class_key;
 
 /*
        }
 }
 
+bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
+{
+       const void *here = __builtin_return_address(0);
+       int n = atomic_fetch_add_unless(&call->usage, 1, 0);
+
+       if (n == 0)
+               return false;
+       trace_rxrpc_call(call->debug_id, op, n, here, NULL);
+       return true;
+}
+
 /*
  * Note the addition of a ref on a call.
  */
        spin_unlock_bh(&call->lock);
 
        rxrpc_put_call_slot(call);
-
-       del_timer_sync(&call->timer);
+       rxrpc_delete_call_timer(call);
 
        /* Make sure we don't get any more notifications */
        write_lock_bh(&rx->recvmsg_lock);
        struct rxrpc_call *call = container_of(work, struct rxrpc_call, processor);
        struct rxrpc_net *rxnet = call->rxnet;
 
+       rxrpc_delete_call_timer(call);
+
        rxrpc_put_connection(call->conn);
        rxrpc_put_peer(call->peer);
        kfree(call->rxtx_buffer);
 
        memset(&call->sock_node, 0xcd, sizeof(call->sock_node));
 
-       del_timer_sync(&call->timer);
-
        ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
        ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags));