Unregister the debugirq during kexec, otherwise the kexec kernel can not
bind to the still registered virq.
Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
---
arch/x86/xen/smp.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
Index: linux-3.0/arch/x86/xen/smp.c
===================================================================
--- linux-3.0.orig/arch/x86/xen/smp.c
+++ linux-3.0/arch/x86/xen/smp.c
@@ -16,6 +16,7 @@
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/smp.h>
+#include <linux/syscore_ops.h>
#include <asm/paravirt.h>
#include <asm/desc.h>
@@ -45,6 +46,21 @@ static DEFINE_PER_CPU(int, xen_debug_irq
static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id);
static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id);
+static void xen_hvn_smp_shutdown(void)
+{
+ int cpu;
+ for_each_online_cpu(cpu) {
+ if (per_cpu(xen_debug_irq, cpu) < 0)
+ continue;
+ unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL);
+ per_cpu(xen_debug_irq, cpu) = -1;
+ }
+}
+
+static struct syscore_ops xen_hvn_smp_syscore_ops = {
+ .shutdown = xen_hvn_smp_shutdown,
+};
+
/*
* Reschedule call back.
*/
@@ -525,6 +541,7 @@ static void __init xen_hvm_smp_prepare_c
return;
xen_init_lock_cpu(0);
xen_init_spinlocks();
+ register_syscore_ops(&xen_hvn_smp_syscore_ops);
}
static int __cpuinit xen_hvm_cpu_up(unsigned int cpu)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|