From: David Wang <davidw...@zhaoxin.com> By the hpet_get_channel(), cpus share an in-use channel somtime. So, core shouldn't clear cpumask while others are getting first cpumask. If core zero and core one share an channel, the cpumask is 0x3. Core zero clear cpumask between core one executing cpumask_empty() and cpumask_first(). The return of cpumask_first() is nr_cpu_ids. That would lead to ASSERT(cpu < nr_cpu_ids).
Signed-off-by: David Wang <davidw...@zhaoxin.com> --- xen/arch/x86/hpet.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index bc7a851..69a7b3a 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -740,7 +740,9 @@ void hpet_broadcast_exit(void) if ( !reprogram_timer(deadline) ) raise_softirq(TIMER_SOFTIRQ); + spin_lock_irq(&ch->lock); cpumask_clear_cpu(cpu, ch->cpumask); + spin_unlock_irq(&ch->lock); if ( !(ch->flags & HPET_EVT_LEGACY) ) hpet_detach_channel(cpu, ch); -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel