From: Paul E. McKenney Date: Thu, 28 Feb 2008 00:21:10 +0000 (-0800) Subject: rcupreempt: fix hibernate/resume in presence of PREEMPT_RCU and hotplug X-Git-Tag: v2.6.25-rc4~130 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae778869ae4549628b9e83efe958c3aaa63ed1b9;p=linux-2.6 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 Tested-by: Dave Young Signed-off-by: Paul E. McKenney Signed-off-by: Ingo Molnar --- diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index c7c52096df..845abcd472 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c @@ -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;