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

[Xen-devel] [PATCH 04/11] xen/hvm kexec: unregister timer interrupt during reboot


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx
  • From: Olaf Hering <olaf@xxxxxxxxx>
  • Date: Thu, 28 Jul 2011 15:23:04 +0200
  • Delivery-date: Thu, 28 Jul 2011 06:27:50 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

Unregister the timer interrupt during kexec, otherwise the kexec kernel will
run into the BUG() in bind_virq_to_irq() when trying to bind to the
still registered virq.

v2:
 use kexec_is_loaded() function

Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>

---
 arch/x86/xen/time.c |   30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

Index: linux-3.0/arch/x86/xen/time.c
===================================================================
--- linux-3.0.orig/arch/x86/xen/time.c
+++ linux-3.0/arch/x86/xen/time.c
@@ -14,6 +14,8 @@
 #include <linux/kernel_stat.h>
 #include <linux/math64.h>
 #include <linux/gfp.h>
+#include <linux/kexec.h>
+#include <linux/syscore_ops.h>
 
 #include <asm/pvclock.h>
 #include <asm/xen/hypervisor.h>
@@ -405,11 +407,19 @@ void xen_setup_timer(int cpu)
        evt->irq = irq;
 }
 
-void xen_teardown_timer(int cpu)
+static void xen_unbind_timer(int cpu)
 {
        struct clock_event_device *evt;
        evt = &per_cpu(xen_clock_events, cpu);
-       unbind_from_irqhandler(evt->irq, NULL);
+       if (evt->irq >= 0) {
+               unbind_from_irqhandler(evt->irq, NULL);
+               evt->irq = -1;
+       }
+}
+
+void xen_teardown_timer(int cpu)
+{
+       xen_unbind_timer(cpu);
 }
 
 void xen_setup_cpu_clockevents(void)
@@ -477,6 +487,21 @@ void __init xen_init_time_ops(void)
 }
 
 #ifdef CONFIG_XEN_PVHVM
+static void xen_hvm_timer_shutdown(void)
+{
+       int cpu;
+
+       if (!kexec_is_loaded())
+               return;
+
+       for_each_online_cpu(cpu)
+               xen_unbind_timer(cpu);
+}
+
+static struct syscore_ops xen_hvmtimer_syscore_ops = {
+       .shutdown = xen_hvm_timer_shutdown,
+};
+
 static void xen_hvm_setup_cpu_clockevents(void)
 {
        int cpu = smp_processor_id();
@@ -505,5 +530,6 @@ void __init xen_hvm_init_time_ops(void)
        x86_platform.calibrate_tsc = xen_tsc_khz;
        x86_platform.get_wallclock = xen_get_wallclock;
        x86_platform.set_wallclock = xen_set_wallclock;
+       register_syscore_ops(&xen_hvmtimer_syscore_ops);
 }
 #endif


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


 


Rackspace

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