From 1aeb1156fa43fe2cd2b5003995b20466cd19a622 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 26 Mar 2015 11:18:28 +0100 Subject: [PATCH] x86: don't change affinity with interrupt unmasked With ->startup unmasking the IRQ, setting the affinity afterwards without masking the IRQ again is invalid namely for MSI (address and data can't be updated atomically and may - at least for MSI-X - be cached while unmasked). Signed-off-by: Jan Beulich Reviewed-by: Konrad Rzeszutek Wilk Reviewed-by: Andrew Cooper --- xen/arch/x86/irq.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 786d1fc7c8..b359940fef 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -1608,12 +1608,13 @@ int pirq_guest_bind(struct vcpu *v, struct pirq *pirq, int will_share) init_timer(&action->eoi_timer, irq_guest_eoi_timer_fn, desc, 0); desc->status |= IRQ_GUEST; - desc->status &= ~IRQ_DISABLED; - desc->handler->startup(desc); /* Attempt to bind the interrupt target to the correct CPU. */ if ( !opt_noirqbalance && (desc->handler->set_affinity != NULL) ) desc->handler->set_affinity(desc, cpumask_of(v->processor)); + + desc->status &= ~IRQ_DISABLED; + desc->handler->startup(desc); } else if ( !will_share || !action->shareable ) { -- 2.30.2