On 20.11.2025 10:06, Roger Pau Monne wrote:
> Setting the irq descriptor target CPU mask of high priority interrupts to
> contain all online CPUs is not accurate.  External interrupts are
> exclusively delivered using physical destination mode, and hence can only
> target a single CPU.  Setting the descriptor CPU mask to contain all online
> CPUs makes it impossible for Xen to figure out which CPU the interrupt is
> really targeting.
> 
> Instead handle high priority vectors used by external interrupts similarly
> to normal vectors, keeping the target CPU mask accurate.  Introduce
> specific code in _assign_irq_vector() to deal with moving high priority
> vectors across CPUs, this is needed at least for fixup_irqs() to be able to
> evacuate those if the target CPU goes offline.
> 
> Fixes: fc0c3fa2ad5c ("x86/IO-APIC: fix setup of Xen internally used IRQs 
> (take 2)")
> Signed-off-by: Roger Pau MonnĂ© <[email protected]>

Reviewed-by: Jan Beulich <[email protected]>
with one further request:

> @@ -756,12 +770,10 @@ void setup_vector_irq(unsigned int cpu)
>          if ( !irq_desc_initialized(desc) )
>              continue;
>          vector = irq_to_vector(irq);
> -        if ( vector >= FIRST_HIPRIORITY_VECTOR &&
> -             vector <= LAST_HIPRIORITY_VECTOR )
> -            cpumask_set_cpu(cpu, desc->arch.cpu_mask);
> -        else if ( !cpumask_test_cpu(cpu, desc->arch.cpu_mask) )
> -            continue;
> -        per_cpu(vector_irq, cpu)[vector] = irq;
> +        if ( (vector >= FIRST_HIPRIORITY_VECTOR &&
> +              vector <= LAST_HIPRIORITY_VECTOR) ||
> +             cpumask_test_cpu(cpu, desc->arch.cpu_mask) )
> +            per_cpu(vector_irq, cpu)[vector] = irq;

Going beyond desc->arch.cpu_mask for hiprio vectors may deserve a comment here. 
When
the vector is global, this is necessary. But for e.g. the serial IRQ (which 
still
moves, but isn't bound to multiple CPUs, the more normal way of respecting
desc->arch.cpu_mask would be sufficient. It is merely (largely) benign if we set
vector_irq[] also for other CPUs. "Largely" because strictly speaking if that 
vector
triggered on the wrong CPU for whatever reason, we rather shouldn't treat it as 
a
legitimate interrupt.

Jan

Reply via email to