summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2018-06-06 08:46:59 -0400
committerThomas Gleixner <tglx@linutronix.de>2018-06-06 09:18:20 -0400
commitd340ebd696f921d3ad01b8c0c29dd38f2ad2bf3e (patch)
tree0ff98712afaabccc563dcababaa77ddf6caeb2aa
parenta33a5d2d16cb84bea8d5f5510f3a41aa48b5c467 (diff)
genirq/migration: Avoid out of line call if pending is not set
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
-rw-r--r--include/linux/irq.h7
-rw-r--r--kernel/irq/migration.c5
2 files changed, 7 insertions, 5 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 65916a305f3d..4e66378f290b 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -551,7 +551,12 @@ extern int irq_affinity_online_cpu(unsigned int cpu);
551#endif 551#endif
552 552
553#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) 553#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
554void irq_move_irq(struct irq_data *data); 554void __irq_move_irq(struct irq_data *data);
555static inline void irq_move_irq(struct irq_data *data)
556{
557 if (unlikely(irqd_is_setaffinity_pending(data)))
558 __irq_move_irq(data);
559}
555void irq_move_masked_irq(struct irq_data *data); 560void irq_move_masked_irq(struct irq_data *data);
556void irq_force_complete_move(struct irq_desc *desc); 561void irq_force_complete_move(struct irq_desc *desc);
557#else 562#else
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c
index 8b8cecd18cce..def48589ea48 100644
--- a/kernel/irq/migration.c
+++ b/kernel/irq/migration.c
@@ -91,7 +91,7 @@ void irq_move_masked_irq(struct irq_data *idata)
91 cpumask_clear(desc->pending_mask); 91 cpumask_clear(desc->pending_mask);
92} 92}
93 93
94void irq_move_irq(struct irq_data *idata) 94void __irq_move_irq(struct irq_data *idata)
95{ 95{
96 bool masked; 96 bool masked;
97 97
@@ -102,9 +102,6 @@ void irq_move_irq(struct irq_data *idata)
102 */ 102 */
103 idata = irq_desc_get_irq_data(irq_data_to_desc(idata)); 103 idata = irq_desc_get_irq_data(irq_data_to_desc(idata));
104 104
105 if (likely(!irqd_is_setaffinity_pending(idata)))
106 return;
107
108 if (unlikely(irqd_irq_disabled(idata))) 105 if (unlikely(irqd_irq_disabled(idata)))
109 return; 106 return;
110 107