|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 04/12] x86/irq: set accurate cpu_mask for high priority vectors used by external interrupts
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é <roger.pau@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |