}
 
 /*
- * Final call destruction under RCU.
+ * Final call destruction - but must be done in process context.
  */
-static void rxrpc_rcu_destroy_call(struct rcu_head *rcu)
+static void rxrpc_destroy_call(struct work_struct *work)
 {
-       struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu);
+       struct rxrpc_call *call = container_of(work, struct rxrpc_call, processor);
        struct rxrpc_net *rxnet = call->rxnet;
 
        rxrpc_put_connection(call->conn);
                wake_up_var(&rxnet->nr_calls);
 }
 
+/*
+ * Final call destruction under RCU.
+ */
+static void rxrpc_rcu_destroy_call(struct rcu_head *rcu)
+{
+       struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu);
+
+       if (in_softirq()) {
+               INIT_WORK(&call->processor, rxrpc_destroy_call);
+               if (!rxrpc_queue_work(&call->processor))
+                       BUG();
+       } else {
+               rxrpc_destroy_call(&call->processor);
+       }
+}
+
 /*
  * clean up a call
  */