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

Reply via email to