[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] x86/hpet: Fix possible ASSERT(cpu < nr_cpu_ids)
From: David Wang <davidwang@xxxxxxxxxxx> For the ch->cpumask be cleared by other cpu, cpumask_first() called by hpet_detach_channel() return nr_cpu_ids. That lead an assertion in set_channel_irq_affinity() when cpumask_of() check cpu. Fix this by using a local variable. Signed-off-by: David Wang <davidwang@xxxxxxxxxxx> --- xen/arch/x86/hpet.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index bc7a851..6b3587a 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -509,15 +509,18 @@ static void hpet_attach_channel(unsigned int cpu, static void hpet_detach_channel(unsigned int cpu, struct hpet_event_channel *ch) { + cpumask_t cpumask; + spin_lock_irq(&ch->lock); ASSERT(ch == per_cpu(cpu_bc_channel, cpu)); per_cpu(cpu_bc_channel, cpu) = NULL; + cpumask_copy(&cpumask, ch->cpumask); if ( cpu != ch->cpu ) spin_unlock_irq(&ch->lock); - else if ( cpumask_empty(ch->cpumask) ) + else if ( cpumask_empty(&cpumask) ) { ch->cpu = -1; clear_bit(HPET_EVT_USED_BIT, &ch->flags); @@ -525,7 +528,7 @@ static void hpet_detach_channel(unsigned int cpu, } else { - ch->cpu = cpumask_first(ch->cpumask); + ch->cpu = cpumask_first(&cpumask); set_channel_irq_affinity(ch); local_irq_enable(); } -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |