Along the lines of hpet_disable_channel(), split out hpet_enable_channel() as well, to then use both functions from set_channel_irq_affinity().
Signed-off-by: Jan Beulich <[email protected]> --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -257,10 +257,9 @@ static void cf_check hpet_interrupt_hand handle_hpet_broadcast(ch); } -static void cf_check hpet_msi_unmask(struct irq_desc *desc) +static void hpet_enable_channel(struct hpet_event_channel *ch) { u32 cfg; - struct hpet_event_channel *ch = desc->action->dev_id; cfg = hpet_read32(HPET_Tn_CFG(ch->idx)); cfg |= HPET_TN_ENABLE; @@ -268,6 +267,11 @@ static void cf_check hpet_msi_unmask(str ch->msi.msi_attrib.host_masked = 0; } +static void cf_check hpet_msi_unmask(struct irq_desc *desc) +{ + hpet_enable_channel(desc->action->dev_id); +} + static void hpet_disable_channel(struct hpet_event_channel *ch) { u32 cfg; @@ -503,14 +507,15 @@ static void set_channel_irq_affinity(str per_cpu(lru_channel, ch->cpu) = ch; + hpet_disable_channel(ch); + ASSERT(!local_irq_is_enabled()); spin_lock(&desc->lock); - hpet_msi_mask(desc); hpet_msi_set_affinity(desc, cpumask_of(ch->cpu)); per_cpu(vector_irq, ch->cpu)[HPET_BROADCAST_VECTOR] = ch->msi.irq; - hpet_msi_unmask(desc); spin_unlock(&desc->lock); + hpet_enable_channel(ch); spin_unlock(&ch->lock); /* We may have missed an interrupt due to the temporary masking. */
