]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
genirq/migration: Avoid out of line call if pending is not set
authorThomas Gleixner <tglx@linutronix.de>
Wed, 6 Jun 2018 12:46:59 +0000 (14:46 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Jun 2018 23:54:05 +0000 (07:54 +0800)
commit d340ebd696f921d3ad01b8c0c29dd38f2ad2bf3e upstream.

The upcoming fix for the -EBUSY return from affinity settings requires to
use the irq_move_irq() functionality even on irq remapped interrupts. To
avoid the out of line call, move the check for the pending bit into an
inline helper.

Preparatory change for the real fix. No functional change.

Fixes: dccfe3147b42 ("x86/vector: Simplify vector move cleanup")
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Joerg Roedel <jroedel@suse.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <liu.song.a23@gmail.com>
Cc: Dmitry Safonov <0x7f454c46@gmail.com>
Cc: stable@vger.kernel.org
Cc: Mike Travis <mike.travis@hpe.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Tariq Toukan <tariqt@mellanox.com>
Cc: Dou Liyang <douly.fnst@cn.fujitsu.com>
Link: https://lkml.kernel.org/r/20180604162224.471925894@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/irq.h
kernel/irq/migration.c

index a0231e96a578348c21596a3c9d2d0cbe4a9a1249..9665ef8c031ea6aa00c435891c2b9901b8bb1d00 100644 (file)
@@ -556,7 +556,12 @@ extern int irq_affinity_online_cpu(unsigned int cpu);
 #endif
 
 #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
-void irq_move_irq(struct irq_data *data);
+void __irq_move_irq(struct irq_data *data);
+static inline void irq_move_irq(struct irq_data *data)
+{
+       if (unlikely(irqd_is_setaffinity_pending(data)))
+               __irq_move_irq(data);
+}
 void irq_move_masked_irq(struct irq_data *data);
 void irq_force_complete_move(struct irq_desc *desc);
 #else
index 8b8cecd18cce1df2da0d3b7b1b5241d9432aa4b4..def48589ea484d44188b8c574cadacfabf21b827 100644 (file)
@@ -91,7 +91,7 @@ void irq_move_masked_irq(struct irq_data *idata)
        cpumask_clear(desc->pending_mask);
 }
 
-void irq_move_irq(struct irq_data *idata)
+void __irq_move_irq(struct irq_data *idata)
 {
        bool masked;
 
@@ -102,9 +102,6 @@ void irq_move_irq(struct irq_data *idata)
         */
        idata = irq_desc_get_irq_data(irq_data_to_desc(idata));
 
-       if (likely(!irqd_is_setaffinity_pending(idata)))
-               return;
-
        if (unlikely(irqd_irq_disabled(idata)))
                return;