From 474a91deb833775cb114a4b3f73cc1aca999eacc Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Tue, 16 Oct 2007 23:30:56 -0700 Subject: [PATCH] --- yaml --- r: 70745 b: refs/heads/master c: f7b4cddcc5aca03e80e357360c9424dfba5056c2 h: refs/heads/master i: 70743: 8d97dbe0ba9b270eae947262b03760cc2be29aa0 v: v3 --- [refs] | 2 +- trunk/kernel/sched.c | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index e8ebeecb5803..0c691f19a458 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cf7a44168d743ca97863b7f34ed42a45fd7b5ab0 +refs/heads/master: f7b4cddcc5aca03e80e357360c9424dfba5056c2 diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 0da2b2635c54..c747bc9f3c24 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -5060,6 +5060,17 @@ static int migration_thread(void *data) } #ifdef CONFIG_HOTPLUG_CPU + +static int __migrate_task_irq(struct task_struct *p, int src_cpu, int dest_cpu) +{ + int ret; + + local_irq_disable(); + ret = __migrate_task(p, src_cpu, dest_cpu); + local_irq_enable(); + return ret; +} + /* * Figure out where task on dead CPU should go, use force if neccessary. * NOTE: interrupts should be disabled by the caller @@ -5098,7 +5109,7 @@ static void move_task_off_dead_cpu(int dead_cpu, struct task_struct *p) "longer affine to cpu%d\n", p->pid, p->comm, dead_cpu); } - } while (!__migrate_task(p, dead_cpu, dest_cpu)); + } while (!__migrate_task_irq(p, dead_cpu, dest_cpu)); } /* @@ -5126,7 +5137,7 @@ static void migrate_live_tasks(int src_cpu) { struct task_struct *p, *t; - write_lock_irq(&tasklist_lock); + read_lock(&tasklist_lock); do_each_thread(t, p) { if (p == current) @@ -5136,7 +5147,7 @@ static void migrate_live_tasks(int src_cpu) move_task_off_dead_cpu(src_cpu, p); } while_each_thread(t, p); - write_unlock_irq(&tasklist_lock); + read_unlock(&tasklist_lock); } /* @@ -5214,11 +5225,10 @@ static void migrate_dead(unsigned int dead_cpu, struct task_struct *p) * Drop lock around migration; if someone else moves it, * that's OK. No task can be added to this CPU, so iteration is * fine. - * NOTE: interrupts should be left disabled --dev@ */ - spin_unlock(&rq->lock); + spin_unlock_irq(&rq->lock); move_task_off_dead_cpu(dead_cpu, p); - spin_lock(&rq->lock); + spin_lock_irq(&rq->lock); put_task_struct(p); }