x86/vector: Merge allocate_vector() into assign_vector_locked()
authorDou Liyang <douly.fnst@cn.fujitsu.com>
Fri, 11 May 2018 08:09:56 +0000 (16:09 +0800)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 19 May 2018 13:09:11 +0000 (15:09 +0200)
assign_vector_locked() calls allocate_vector() to get a real vector for an
IRQ. If the current target CPU is online and in the new requested affinity
mask, allocate_vector() will return 0 and nothing should be done. But,
assign_vector_locked() calls apic_update_irq_cfg() even in that case which
is pointless.

allocate_vector() is not called from anything else, so the functions can be
merged and in case of no change the apic_update_irq_cfg() can be avoided.

[ tglx: Massaged changelog ]

Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: hpa@zytor.com
Link: https://lkml.kernel.org/r/20180511080956.6316-1-douly.fnst@cn.fujitsu.com
arch/x86/kernel/apic/vector.c

index bb6f7a2..a75de07 100644 (file)
@@ -218,7 +218,8 @@ static int reserve_irq_vector(struct irq_data *irqd)
        return 0;
 }
 
-static int allocate_vector(struct irq_data *irqd, const struct cpumask *dest)
+static int
+assign_vector_locked(struct irq_data *irqd, const struct cpumask *dest)
 {
        struct apic_chip_data *apicd = apic_chip_data(irqd);
        bool resvd = apicd->has_reserved;
@@ -236,22 +237,12 @@ static int allocate_vector(struct irq_data *irqd, const struct cpumask *dest)
                return 0;
 
        vector = irq_matrix_alloc(vector_matrix, dest, resvd, &cpu);
-       if (vector > 0)
-               apic_update_vector(irqd, vector, cpu);
        trace_vector_alloc(irqd->irq, vector, resvd, vector);
-       return vector;
-}
-
-static int assign_vector_locked(struct irq_data *irqd,
-                               const struct cpumask *dest)
-{
-       struct apic_chip_data *apicd = apic_chip_data(irqd);
-       int vector = allocate_vector(irqd, dest);
-
        if (vector < 0)
                return vector;
+       apic_update_vector(irqd, vector, cpu);
+       apic_update_irq_cfg(irqd, vector, cpu);
 
-       apic_update_irq_cfg(irqd, apicd->vector, apicd->cpu);
        return 0;
 }