x86/apic/vector: Ignore set_affinity call for inactive interrupts
authorThomas Gleixner <tglx@linutronix.de>
Thu, 12 Oct 2017 09:05:28 +0000 (11:05 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 12 Oct 2017 10:58:15 +0000 (12:58 +0200)
The core interrupt code can call the affinity setter for inactive
interrupts under certain circumstances.

For inactive intererupts which use managed or reservation mode this is a
pointless exercise as the activation will assign a vector which fits the
destination mask.

Check for this and return w/o going through the vector assignment.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/kernel/apic/vector.c

index 6789e28..573538e 100644 (file)
@@ -726,8 +726,21 @@ void lapic_offline(void)
 static int apic_set_affinity(struct irq_data *irqd,
                             const struct cpumask *dest, bool force)
 {
+       struct apic_chip_data *apicd = apic_chip_data(irqd);
        int err;
 
+       /*
+        * Core code can call here for inactive interrupts. For inactive
+        * interrupts which use managed or reservation mode there is no
+        * point in going through the vector assignment right now as the
+        * activation will assign a vector which fits the destination
+        * cpumask. Let the core code store the destination mask and be
+        * done with it.
+        */
+       if (!irqd_is_activated(irqd) &&
+           (apicd->is_managed || apicd->can_reserve))
+               return IRQ_SET_MASK_OK;
+
        raw_spin_lock(&vector_lock);
        cpumask_and(vector_searchmask, dest, cpu_online_mask);
        if (irqd_affinity_is_managed(irqd))