rcu: Improve __call_rcu() debug-objects error message
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 3 May 2017 18:38:55 +0000 (11:38 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 9 Jun 2017 01:52:31 +0000 (18:52 -0700)
The "__call_rcu(): Leaked duplicate callback" error message from
__call_rcu() has proven to be unhelpful.  This commit therefore changes
it to "__call_rcu(): Double-freed CB" and adds the value of the pointer
passed in.  The value of the pointer improves debuggability by allowing
correlation with tracing output, for example, the rcu:rcu_callback trace
event.

Reported-by: Vegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/tree.c

index 61a97164abcc6824559b64d0315359089f5769af..cac24f5d3fd210fbb70d7ff68f8a458e55b4d603 100644 (file)
@@ -3161,9 +3161,14 @@ __call_rcu(struct rcu_head *head, rcu_callback_t func,
        WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1));
 
        if (debug_rcu_head_queue(head)) {
-               /* Probable double call_rcu(), so leak the callback. */
+               /*
+                * Probable double call_rcu(), so leak the callback.
+                * Use rcu:rcu_callback trace event to find the previous
+                * time callback was passed to __call_rcu().
+                */
+               WARN_ONCE(1, "__call_rcu(): Double-freed CB %p->%pF()!!!\n",
+                         head, head->func);
                WRITE_ONCE(head->func, rcu_leak_callback);
-               WARN_ONCE(1, "__call_rcu(): Leaked duplicate callback\n");
                return;
        }
        head->func = func;