[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [IA64] fix {un}lock_ipi_calllock().



# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1225776924 -32400
# Node ID 57c94bdbd6b3cd9246d108251c60f5ac9237ae02
# Parent  e75cb35c798beabee0b0ed4025ef82a39c702279
[IA64] fix {un}lock_ipi_calllock().

Now _raw_spin_lock() checks whether interrupt is masked or not.
If masked, it panics.
lock_ipi_calllock() violates the assumption.
This patch make lock_ipi_calllock() use spin_lock_irqsave()
instead of spin_lock_irq().

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 xen/arch/ia64/linux-xen/smp.c            |   15 +++++++++++++++
 xen/arch/ia64/linux-xen/smpboot.c        |   12 ++++++++++++
 xen/include/asm-ia64/linux-xen/asm/smp.h |    5 +++++
 3 files changed, 32 insertions(+)

diff -r e75cb35c798b -r 57c94bdbd6b3 xen/arch/ia64/linux-xen/smp.c
--- a/xen/arch/ia64/linux-xen/smp.c     Tue Nov 04 12:43:19 2008 +0900
+++ b/xen/arch/ia64/linux-xen/smp.c     Tue Nov 04 14:35:24 2008 +0900
@@ -101,6 +101,20 @@ static DEFINE_PER_CPU(u64, ipi_operation
 
 extern void cpu_halt (void);
 
+#ifdef XEN
+/* work around for spinlock irq check. */
+void
+lock_ipi_calllock(unsigned long *flags)
+{
+       spin_lock_irqsave(&call_lock, *flags);
+}
+
+void
+unlock_ipi_calllock(unsigned long flags)
+{
+       spin_unlock_irqrestore(&call_lock, flags);
+}
+#else
 void
 lock_ipi_calllock(void)
 {
@@ -112,6 +126,7 @@ unlock_ipi_calllock(void)
 {
        spin_unlock_irq(&call_lock);
 }
+#endif
 
 static void
 stop_this_cpu (void)
diff -r e75cb35c798b -r 57c94bdbd6b3 xen/arch/ia64/linux-xen/smpboot.c
--- a/xen/arch/ia64/linux-xen/smpboot.c Tue Nov 04 12:43:19 2008 +0900
+++ b/xen/arch/ia64/linux-xen/smpboot.c Tue Nov 04 14:35:24 2008 +0900
@@ -364,6 +364,10 @@ static void __devinit
 static void __devinit
 smp_callin (void)
 {
+#ifdef XEN
+       /* work around for spinlock irq assert. */
+       unsigned long flags;
+#endif
        int cpuid, phys_id;
        extern void ia64_init_itm(void);
 
@@ -382,9 +386,17 @@ smp_callin (void)
 
        fix_b0_for_bsp();
 
+#ifdef XEN
+       lock_ipi_calllock(&flags);
+#else
        lock_ipi_calllock();
+#endif
        cpu_set(cpuid, cpu_online_map);
+#ifdef XEN
+       unlock_ipi_calllock(flags);
+#else
        unlock_ipi_calllock();
+#endif
        per_cpu(cpu_state, cpuid) = CPU_ONLINE;
 
        smp_setup_percpu_timer();
diff -r e75cb35c798b -r 57c94bdbd6b3 xen/include/asm-ia64/linux-xen/asm/smp.h
--- a/xen/include/asm-ia64/linux-xen/asm/smp.h  Tue Nov 04 12:43:19 2008 +0900
+++ b/xen/include/asm-ia64/linux-xen/asm/smp.h  Tue Nov 04 14:35:24 2008 +0900
@@ -131,8 +131,13 @@ extern int smp_call_function_single (int
 extern int smp_call_function_single (int cpuid, void (*func) (void *info), 
void *info,
                                     int retry, int wait);
 extern void smp_send_reschedule (int cpu);
+#ifdef XEN
+extern void lock_ipi_calllock(unsigned long *flags);
+extern void unlock_ipi_calllock(unsigned long flags);
+#else
 extern void lock_ipi_calllock(void);
 extern void unlock_ipi_calllock(void);
+#endif
 extern void identify_siblings (struct cpuinfo_ia64 *);
 
 #else

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.