[Xen-changelog] [xen-unstable] x86: Disable spinlock checks temporarily
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1258040077 0
# Node ID 32a27fe01e07b55a9390a575139f4d8a2d6fdbea
# Parent accded2f185f4178f875b170a5c01544648a68d2
x86: Disable spinlock checks temporarily while bringing a CPU online.
This is safe, as described in a code comment. Also fix up another
comment in start_secondary() while we're there.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen/arch/x86/smpboot.c | 25 ++++++++++++++++++++++++-
1 files changed, 24 insertions(+), 1 deletion(-)
diff -r accded2f185f -r 32a27fe01e07 xen/arch/x86/smpboot.c
--- a/xen/arch/x86/smpboot.c Thu Nov 12 13:15:40 2009 +0000
+++ b/xen/arch/x86/smpboot.c Thu Nov 12 15:34:37 2009 +0000
@@ -494,6 +494,24 @@ void __devinit start_secondary(void *unu
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.
@@ -517,10 +535,15 @@ void __devinit start_secondary(void *unu
/* This must be done before setting cpu_online_map */
- /* Initlize vector_irq for BSPs */
+ * We need to hold vector_lock so there the set of online cpus
+ * does not change while we are assigning vectors to cpus. Holding
+ * this lock ensures we don't half assign or remove an irq from a cpu.
Xen-changelog mailing list
|<Prev in Thread]
||[Next in Thread>|
- [Xen-changelog] [xen-unstable] x86: Disable spinlock checks temporarily while bringing a CPU online.,
Xen patchbot-unstable <=