[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.4-testing] x86: Disable spinlock checks temporarily while bringing a CPU online.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1259310277 0 # Node ID f937968640d804942d8b779633f9c04045ea1142 # Parent 8c5708bc87adb3ae7dd5f0ccc7a84bb57f7ca8f4 x86: Disable spinlock checks temporarily while bringing a CPU online. This is safe, as described in a code comment. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> xen-unstable changeset: 20441:32a27fe01e07 xen-unstable date: Thu Nov 12 15:34:37 2009 +0000 --- xen/arch/x86/smpboot.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) diff -r 8c5708bc87ad -r f937968640d8 xen/arch/x86/smpboot.c --- a/xen/arch/x86/smpboot.c Fri Nov 27 08:22:41 2009 +0000 +++ b/xen/arch/x86/smpboot.c Fri Nov 27 08:24:37 2009 +0000 @@ -489,6 +489,24 @@ void __devinit start_secondary(void *unu rdmsrl(MSR_EFER, this_cpu(efer)); asm volatile ( "mov %%cr4,%0" : "=r" (this_cpu(cr4)) ); + /* + * Just as during early bootstrap, it is convenient here to disable + * spinlock checking while we have IRQs disabled. This allows us to + * acquire IRQ-unsafe locks when it would otherwise be disallowed. + * + * It is safe because the race we are usually trying to avoid involves + * a group of CPUs rendezvousing in an IPI handler, where one cannot + * join because it is spinning with IRQs disabled waiting to acquire a + * lock held by another in the rendezvous group (the lock must be an + * IRQ-unsafe lock since the CPU took the IPI after acquiring it, and + * hence had IRQs enabled). This is a deadlock scenario. + * + * However, no CPU can be involved in rendezvous until it is online, + * hence no such group can be waiting for this CPU until it is + * visible in cpu_online_map. Hence such a deadlock is not possible. + */ + spin_debug_disable(); + percpu_traps_init(); cpu_init(); @@ -515,6 +533,7 @@ void __devinit start_secondary(void *unu set_cpu_sibling_map(raw_smp_processor_id()); wmb(); + spin_debug_enable(); cpu_set(smp_processor_id(), cpu_online_map); per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |