diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-03-21 13:03:45 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-03-22 11:36:54 -0400 |
commit | 106b44388d8f76373149c4ea144f717b6d4d9a6d (patch) | |
tree | a77530a84d10315225fc153e29ed7ac56c0bf54c /arch/x86 | |
parent | 27257fc07c044af99d85400c4bab670342bbc8a5 (diff) |
xen/smp: Fix bringup bug in AP code.
The CPU hotplug code has now a callback to help bring up the CPU.
Without the call we end up getting:
BUG: soft lockup - CPU#0 stuck for 29s! [migration/0:6]
Modules linked in:
CPU ] Pid: 6, comm: migration/0 Not tainted 3.3.0upstream-01180-ged378a5 #1 Dell Inc. PowerEdge T105 /0RR825
RIP: e030:[<ffffffff810d3b8b>] [<ffffffff810d3b8b>] stop_machine_cpu_stop+0x7b/0xf0
RSP: e02b:ffff8800ceaabdb0 EFLAGS: 00000293
.. snip..
Call Trace:
[<ffffffff810d3b10>] ? stop_one_cpu_nowait+0x50/0x50
[<ffffffff810d3841>] cpu_stopper_thread+0xf1/0x1c0
[<ffffffff815a9776>] ? __schedule+0x3c6/0x760
[<ffffffff815aa749>] ? _raw_spin_unlock_irqrestore+0x19/0x30
[<ffffffff810d3750>] ? res_counter_charge+0x150/0x150
[<ffffffff8108dc76>] kthread+0x96/0xa0
[<ffffffff815b27e4>] kernel_thread_helper+0x4/0x10
[<ffffffff815aacbc>] ? retint_restore_ar
Thix fixes it.
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/xen/smp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 449f86897db3..240def438dc3 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -75,8 +75,14 @@ static void __cpuinit cpu_bringup(void) | |||
75 | 75 | ||
76 | xen_setup_cpu_clockevents(); | 76 | xen_setup_cpu_clockevents(); |
77 | 77 | ||
78 | notify_cpu_starting(cpu); | ||
79 | |||
80 | ipi_call_lock(); | ||
78 | set_cpu_online(cpu, true); | 81 | set_cpu_online(cpu, true); |
82 | ipi_call_unlock(); | ||
83 | |||
79 | this_cpu_write(cpu_state, CPU_ONLINE); | 84 | this_cpu_write(cpu_state, CPU_ONLINE); |
85 | |||
80 | wmb(); | 86 | wmb(); |
81 | 87 | ||
82 | /* We can take interrupts now: we're officially "up". */ | 88 | /* We can take interrupts now: we're officially "up". */ |