Module Name: src Committed By: jym Date: Sun Aug 28 22:55:52 UTC 2011
Modified Files: src/sys/arch/xen/xen: evtchn.c Log Message: VIRQ_TIMER virqs are allocated and tracked in a array (virq_timer_to_evtch, indexed by cpuid) different from the VIRQ <> event channel one (virq_to_evtch, indexed by event channel ID). This is fine: fix a "harmless" bug that resulted in the event channel of VIRQ_TIMER getting lost during bind as it was not stored in the proper array. "Harmless" because it is not critical for -current, however in the Xen save/restore branch this completely cripples restore. Xen clock gets suspended, but never comes back (fetched channel ID being invalid). Oops. Add a small comment so we can better see the "get => allocate? => set" chain of actions when binding/unbinding event channels. To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.53 src/sys/arch/xen/xen/evtchn.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/xen/xen/evtchn.c diff -u src/sys/arch/xen/xen/evtchn.c:1.52 src/sys/arch/xen/xen/evtchn.c:1.53 --- src/sys/arch/xen/xen/evtchn.c:1.52 Sun Aug 28 22:36:17 2011 +++ src/sys/arch/xen/xen/evtchn.c Sun Aug 28 22:55:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: evtchn.c,v 1.52 2011/08/28 22:36:17 jym Exp $ */ +/* $NetBSD: evtchn.c,v 1.53 2011/08/28 22:55:52 jym Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -54,7 +54,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.52 2011/08/28 22:36:17 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.53 2011/08/28 22:55:52 jym Exp $"); #include "opt_xen.h" #include "isa.h" @@ -379,6 +379,7 @@ return -1; } + /* Get event channel from VIRQ */ if (virq == VIRQ_TIMER) { evtchn = virq_timer_to_evtch[ci->ci_cpuid]; } else { @@ -393,7 +394,12 @@ if (HYPERVISOR_event_channel_op(&op) != 0) panic("Failed to bind virtual IRQ %d\n", virq); evtchn = op.u.bind_virq.port; + } + /* Set event channel */ + if (virq == VIRQ_TIMER) { + virq_timer_to_evtch[ci->ci_cpuid] = evtchn; + } else { virq_to_evtch[virq] = evtchn; }