diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c
index 845abcd472b09782f43e3785c7b8350e2e29e011..e9517014b57c100af5926165d2131992f0589401 100644
--- a/kernel/rcupreempt.c
+++ b/kernel/rcupreempt.c
@@ -952,9 +952,11 @@ static void rcu_process_callbacks(struct softirq_action *unused)
 {
 	unsigned long flags;
 	struct rcu_head *next, *list;
-	struct rcu_data *rdp = RCU_DATA_ME();
+	struct rcu_data *rdp;
 
-	spin_lock_irqsave(&rdp->lock, flags);
+	local_irq_save(flags);
+	rdp = RCU_DATA_ME();
+	spin_lock(&rdp->lock);
 	list = rdp->donelist;
 	if (list == NULL) {
 		spin_unlock_irqrestore(&rdp->lock, flags);