diff --git a/kernel/sched.c b/kernel/sched.c index 6d0dbeb..3640c20 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -5155,9 +5155,11 @@ void __cpuinit init_idle_bootup_task(struct task_struct *idle) void __cpuinit init_idle(struct task_struct *idle, int cpu) { struct rq *rq = cpu_rq(cpu); + struct rq *oldrq = task_rq(idle); unsigned long flags; - raw_spin_lock_irqsave(&rq->lock, flags); + local_irq_save(flags); + double_rq_lock(oldrq, rq); __sched_fork(idle); idle->state = TASK_RUNNING; @@ -5170,7 +5172,8 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) #if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW) idle->oncpu = 1; #endif - raw_spin_unlock_irqrestore(&rq->lock, flags); + double_rq_unlock(oldrq, rq); + local_irq_restore(flags); /* Set the preempt count _outside_ the spinlocks! */ #if defined(CONFIG_PREEMPT)