rcu: Add comment giving debug strategy for double call_rcu()
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 19 Oct 2017 21:52:41 +0000 (14:52 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 11 Dec 2017 17:17:39 +0000 (09:17 -0800)
The following statement has for some reason proven non-intuitive:

WARN_ON_ONCE(rcu_segcblist_empty(&rdp->cblist) != (count == 0));

This commit therefore adds a comment that states that this warning
usually triggers in response to a double call_rcu(), which is sort
of like a double free.  The comment also suggests building with
CONFIG_DEBUG_OBJECTS_RCU_HEAD=y to track down the double call_rcu().

Reported-by: David Howells <dhowells@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/tree.c

index f9c0ca2..1bdc048 100644 (file)
@@ -2789,6 +2789,11 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)
                rdp->n_force_qs_snap = rsp->n_force_qs;
        } else if (count < rdp->qlen_last_fqs_check - qhimark)
                rdp->qlen_last_fqs_check = count;
+
+       /*
+        * The following usually indicates a double call_rcu().  To track
+        * this down, try building with CONFIG_DEBUG_OBJECTS_RCU_HEAD=y.
+        */
        WARN_ON_ONCE(rcu_segcblist_empty(&rdp->cblist) != (count == 0));
 
        local_irq_restore(flags);