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

[Xen-changelog] [linux-2.6.18-xen] linux: panic/shutdown handling adjustments



# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1193325318 -3600
# Node ID b7a740a85fcb5e31edb49dbe594089d814b28714
# Parent  c8002e78cb1b8369427b5350a8334cb3da142469
linux: panic/shutdown handling adjustments

Prevent interrupts (and hence possibly scheduler operations) from
occuring on (against) a CPU after removing it from cpu_online_map
during panic/shutdown.

(Background: I found it quite annoying to see scheduler related
badness or BUG messages after a panic, eventually even leading to
important information scrolling off the screen.)

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
 arch/i386/kernel/smp-xen.c   |    8 ++------
 arch/x86_64/kernel/smp-xen.c |    8 ++------
 drivers/xen/core/evtchn.c    |   10 ++++++++++
 include/xen/evtchn.h         |    1 +
 4 files changed, 15 insertions(+), 12 deletions(-)

diff -r c8002e78cb1b -r b7a740a85fcb arch/i386/kernel/smp-xen.c
--- a/arch/i386/kernel/smp-xen.c        Thu Oct 25 16:10:19 2007 +0100
+++ b/arch/i386/kernel/smp-xen.c        Thu Oct 25 16:15:18 2007 +0100
@@ -558,9 +558,7 @@ static void stop_this_cpu (void * dummy)
         */
        cpu_clear(smp_processor_id(), cpu_online_map);
        local_irq_disable();
-#if 0
-       disable_local_APIC();
-#endif
+       disable_all_local_evtchn();
        if (cpu_data[smp_processor_id()].hlt_works_ok)
                for(;;) halt();
        for (;;);
@@ -575,9 +573,7 @@ void smp_send_stop(void)
        smp_call_function(stop_this_cpu, NULL, 1, 0);
 
        local_irq_disable();
-#if 0
-       disable_local_APIC();
-#endif
+       disable_all_local_evtchn();
        local_irq_enable();
 }
 
diff -r c8002e78cb1b -r b7a740a85fcb arch/x86_64/kernel/smp-xen.c
--- a/arch/x86_64/kernel/smp-xen.c      Thu Oct 25 16:10:19 2007 +0100
+++ b/arch/x86_64/kernel/smp-xen.c      Thu Oct 25 16:15:18 2007 +0100
@@ -482,9 +482,7 @@ void smp_stop_cpu(void)
         */
        cpu_clear(smp_processor_id(), cpu_online_map);
        local_irq_save(flags);
-#ifndef CONFIG_XEN
-       disable_local_APIC();
-#endif
+       disable_all_local_evtchn();
        local_irq_restore(flags); 
 }
 
@@ -512,9 +510,7 @@ void smp_send_stop(void)
                spin_unlock(&call_lock);
 
        local_irq_disable();
-#ifndef CONFIG_XEN
-       disable_local_APIC();
-#endif
+       disable_all_local_evtchn();
        local_irq_enable();
 }
 
diff -r c8002e78cb1b -r b7a740a85fcb drivers/xen/core/evtchn.c
--- a/drivers/xen/core/evtchn.c Thu Oct 25 16:10:19 2007 +0100
+++ b/drivers/xen/core/evtchn.c Thu Oct 25 16:15:18 2007 +0100
@@ -892,6 +892,16 @@ void unmask_evtchn(int port)
 }
 EXPORT_SYMBOL_GPL(unmask_evtchn);
 
+void disable_all_local_evtchn(void)
+{
+       unsigned i, cpu = smp_processor_id();
+       shared_info_t *s = HYPERVISOR_shared_info;
+
+       for (i = 0; i < NR_EVENT_CHANNELS; ++i)
+               if (cpu_from_evtchn(i) == cpu)
+                       synch_set_bit(i, &s->evtchn_mask[0]);
+}
+
 static void restore_cpu_virqs(int cpu)
 {
        struct evtchn_bind_virq bind_virq;
diff -r c8002e78cb1b -r b7a740a85fcb include/xen/evtchn.h
--- a/include/xen/evtchn.h      Thu Oct 25 16:10:19 2007 +0100
+++ b/include/xen/evtchn.h      Thu Oct 25 16:15:18 2007 +0100
@@ -102,6 +102,7 @@ void evtchn_device_upcall(int port);
 void evtchn_device_upcall(int port);
 
 void mask_evtchn(int port);
+void disable_all_local_evtchn(void);
 void unmask_evtchn(int port);
 
 #ifdef CONFIG_SMP

_______________________________________________
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®.