From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH 5/6] xen/hvm kexec: unregister timer interrupt during reboot Date: Tue, 26 Jul 2011 10:22:23 -0400 Message-ID: <20110726142223.GG5994@dumpdata.com> References: <20110726115209.655568638@aepfle.de> <20110726115211.204484318@aepfle.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <20110726115211.204484318@aepfle.de> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Olaf Hering Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org On Tue, Jul 26, 2011 at 01:52:14PM +0200, Olaf Hering wrote: > The kexec kernel will crash because the timer interrupt is already > registerd with EVTCHNOP_bind_virq. Unbind the event channel during > shutdown so that the kexec kernel can reregister the interrupt. > > Signed-off-by: Olaf Hering > > --- > arch/x86/xen/time.c | 27 ++++++++++++++++++++++++--- > 1 file changed, 24 insertions(+), 3 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,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -405,12 +406,20 @@ 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; > - BUG_ON(cpu == 0); > 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) > +{ > + BUG_ON(cpu == 0); Why the BUG? Ah you just copied it from xen_unbind_timer. Hm, I wonder if we actually need that BUG_ON. > + xen_unbind_timer(cpu); > } > > void xen_setup_cpu_clockevents(void) > @@ -478,6 +487,17 @@ void __init xen_init_time_ops(void) > } > > #ifdef CONFIG_XEN_PVHVM > +static void xen_hvmtimer_shutdown(void) > +{ > + int cpu; > + for_each_online_cpu(cpu) > + xen_unbind_timer(cpu); > +} > + > +static struct syscore_ops xen_hvmtimer_syscore_ops = { > + .shutdown = xen_hvmtimer_shutdown, > +}; > + > static void xen_hvm_setup_cpu_clockevents(void) > { > int cpu = smp_processor_id(); > @@ -506,5 +526,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@lists.xensource.com > http://lists.xensource.com/xen-devel