[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 05/11] xen/hvm kexec: unregister debugirq during reboot
Unregister the debugirq 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/smp.c | 22 ++++++++++++++++++++++ 1 file changed, 22 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,8 @@ #include <linux/err.h> #include <linux/slab.h> #include <linux/smp.h> +#include <linux/kexec.h> +#include <linux/syscore_ops.h> #include <asm/paravirt.h> #include <asm/desc.h> @@ -45,6 +47,25 @@ 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; + + if (!kexec_is_loaded()) + return; + + 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 +546,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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |