rcupreempt: fix hibernate/resume in presence of PREEMPT_RCU and hotplug
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 28 Feb 2008 00:21:10 +0000 (16:21 -0800)
committerIngo Molnar <mingo@elte.hu>
Fri, 29 Feb 2008 19:21:13 +0000 (20:21 +0100)
This fixes a oops encountered when doing hibernate/resume in presence of
PREEMPT_RCU.

The problem was that the code failed to disable preemption when
accessing a per-CPU variable.  This is OK when called from code that
already has preemption disabled, but such is not the case from the
suspend/resume code path.

Reported-by: Dave Young <hidave.darkstar@gmail.com>
Tested-by: Dave Young <hidave.darkstar@gmail.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/rcupreempt.c

index c7c52096df48f180d08c133476a9464447d956b9..845abcd472b09782f43e3785c7b8350e2e29e011 100644 (file)
@@ -918,8 +918,9 @@ void rcu_offline_cpu(int cpu)
         * fix.
         */
 
+       local_irq_save(flags);
        rdp = RCU_DATA_ME();
-       spin_lock_irqsave(&rdp->lock, flags);
+       spin_lock(&rdp->lock);
        *rdp->nexttail = list;
        if (list)
                rdp->nexttail = tail;