cpu hotplug: adjust root-domain->online span in response to hotplug event
We currently set the root-domain online span automatically when the domain is added to the cpu if the cpu is already a member of cpu_online_map. This was done as a hack/bug-fix for s2ram, but it also causes a problem with hotplug CPU_DOWN transitioning. The right way to fix the original problem is to actually respond to CPU_UP events, instead of CPU_ONLINE, which is already too late. This solves the hung reboot regression reported by Andrew Morton and others. Signed-off-by: Gregory Haskins <ghaskins@novell.com> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6efcae4601
commit
393d94d98b
|
@ -5813,6 +5813,13 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
|||
/* Must be high prio: stop_machine expects to yield to it. */
|
||||
rq = task_rq_lock(p, &flags);
|
||||
__setscheduler(rq, p, SCHED_FIFO, MAX_RT_PRIO-1);
|
||||
|
||||
/* Update our root-domain */
|
||||
if (rq->rd) {
|
||||
BUG_ON(!cpu_isset(cpu, rq->rd->span));
|
||||
cpu_set(cpu, rq->rd->online);
|
||||
}
|
||||
|
||||
task_rq_unlock(rq, &flags);
|
||||
cpu_rq(cpu)->migration_thread = p;
|
||||
break;
|
||||
|
@ -5821,15 +5828,6 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
|||
case CPU_ONLINE_FROZEN:
|
||||
/* Strictly unnecessary, as first user will wake it. */
|
||||
wake_up_process(cpu_rq(cpu)->migration_thread);
|
||||
|
||||
/* Update our root-domain */
|
||||
rq = cpu_rq(cpu);
|
||||
spin_lock_irqsave(&rq->lock, flags);
|
||||
if (rq->rd) {
|
||||
BUG_ON(!cpu_isset(cpu, rq->rd->span));
|
||||
cpu_set(cpu, rq->rd->online);
|
||||
}
|
||||
spin_unlock_irqrestore(&rq->lock, flags);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
@ -6105,8 +6103,6 @@ static void rq_attach_root(struct rq *rq, struct root_domain *rd)
|
|||
rq->rd = rd;
|
||||
|
||||
cpu_set(rq->cpu, rd->span);
|
||||
if (cpu_isset(rq->cpu, cpu_online_map))
|
||||
cpu_set(rq->cpu, rd->online);
|
||||
|
||||
for (class = sched_class_highest; class; class = class->next) {
|
||||
if (class->join_domain)
|
||||
|
|
Loading…
Reference in New Issue