rcupreempt: fix hibernate/resume in presence of PREEMPT_RCU and hotplug

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 <[email protected]>
Tested-by: Dave Young <[email protected]>
Signed-off-by: Paul E. McKenney <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
Paul E. McKenney 2008-02-27 16:21:10 -08:00 • committed by Ingo Molnar
commit ae778869ae

View 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;