Merge branch 'irq/affinity' into irq/core
authorThomas Gleixner <tglx@linutronix.de>
Wed, 19 May 2021 09:04:47 +0000 (11:04 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 19 May 2021 09:04:47 +0000 (11:04 +0200)
Merge the export of irq_set_affinity() which is a standalone commit so it
can be pulled into other trees.

include/linux/interrupt.h
include/linux/irq.h
kernel/irq/chip.c
kernel/irq/handle.c
kernel/irq/manage.c
kernel/irq/settings.h

index 35a3742..2ed65b0 100644 (file)
@@ -64,6 +64,8 @@
  * IRQF_NO_AUTOEN - Don't enable IRQ or NMI automatically when users request it.
  *                Users will enable it explicitly by enable_irq() or enable_nmi()
  *                later.
+ * IRQF_NO_DEBUG - Exclude from runnaway detection for IPI and similar handlers,
+ *                depends on IRQF_PERCPU.
  */
 #define IRQF_SHARED            0x00000080
 #define IRQF_PROBE_SHARED      0x00000100
@@ -78,6 +80,7 @@
 #define IRQF_EARLY_RESUME      0x00020000
 #define IRQF_COND_SUSPEND      0x00040000
 #define IRQF_NO_AUTOEN         0x00080000
+#define IRQF_NO_DEBUG          0x00100000
 
 #define IRQF_TIMER             (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
index 31b347c..8e9a9ae 100644 (file)
@@ -72,6 +72,7 @@ enum irqchip_irq_state;
  *                               mechanism and from core side polling.
  * IRQ_DISABLE_UNLAZY          - Disable lazy irq disable
  * IRQ_HIDDEN                  - Don't show up in /proc/interrupts
+ * IRQ_NO_DEBUG                        - Exclude from note_interrupt() debugging
  */
 enum {
        IRQ_TYPE_NONE           = 0x00000000,
@@ -99,6 +100,7 @@ enum {
        IRQ_IS_POLLED           = (1 << 18),
        IRQ_DISABLE_UNLAZY      = (1 << 19),
        IRQ_HIDDEN              = (1 << 20),
+       IRQ_NO_DEBUG            = (1 << 21),
 };
 
 #define IRQF_MODIFY_MASK       \
index 8cc8e57..7f04c7d 100644 (file)
@@ -481,7 +481,7 @@ void handle_nested_irq(unsigned int irq)
        for_each_action_of_desc(desc, action)
                action_ret |= action->thread_fn(action->irq, action->dev_id);
 
-       if (!noirqdebug)
+       if (!irq_settings_no_debug(desc))
                note_interrupt(desc, action_ret);
 
        raw_spin_lock_irq(&desc->lock);
index 762a928..221d80c 100644 (file)
@@ -197,7 +197,7 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc)
 
        add_interrupt_randomness(desc->irq_data.irq, flags);
 
-       if (!noirqdebug)
+       if (!irq_settings_no_debug(desc))
                note_interrupt(desc, retval);
        return retval;
 }
index a847dd2..ef30b47 100644 (file)
@@ -1717,8 +1717,13 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
                if (new->flags & IRQF_PERCPU) {
                        irqd_set(&desc->irq_data, IRQD_PER_CPU);
                        irq_settings_set_per_cpu(desc);
+                       if (new->flags & IRQF_NO_DEBUG)
+                               irq_settings_set_no_debug(desc);
                }
 
+               if (noirqdebug)
+                       irq_settings_set_no_debug(desc);
+
                if (new->flags & IRQF_ONESHOT)
                        desc->istate |= IRQS_ONESHOT;
 
index 403378b..7b7efb1 100644 (file)
@@ -18,6 +18,7 @@ enum {
        _IRQ_IS_POLLED          = IRQ_IS_POLLED,
        _IRQ_DISABLE_UNLAZY     = IRQ_DISABLE_UNLAZY,
        _IRQ_HIDDEN             = IRQ_HIDDEN,
+       _IRQ_NO_DEBUG           = IRQ_NO_DEBUG,
        _IRQF_MODIFY_MASK       = IRQF_MODIFY_MASK,
 };
 
@@ -33,6 +34,7 @@ enum {
 #define IRQ_IS_POLLED          GOT_YOU_MORON
 #define IRQ_DISABLE_UNLAZY     GOT_YOU_MORON
 #define IRQ_HIDDEN             GOT_YOU_MORON
+#define IRQ_NO_DEBUG           GOT_YOU_MORON
 #undef IRQF_MODIFY_MASK
 #define IRQF_MODIFY_MASK       GOT_YOU_MORON
 
@@ -174,3 +176,13 @@ static inline bool irq_settings_is_hidden(struct irq_desc *desc)
 {
        return desc->status_use_accessors & _IRQ_HIDDEN;
 }
+
+static inline void irq_settings_set_no_debug(struct irq_desc *desc)
+{
+       desc->status_use_accessors |= _IRQ_NO_DEBUG;
+}
+
+static inline bool irq_settings_no_debug(struct irq_desc *desc)
+{
+       return desc->status_use_accessors & _IRQ_NO_DEBUG;
+}