Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1657065

[tip:irq/core] genirq: Warn when IRQ_NOAUTOEN is used with shared interrupts

From tip-bot for Thomas Gleixner <tipbot@zytor.com>
Newsgroups linux.kernel
Subject [tip:irq/core] genirq: Warn when IRQ_NOAUTOEN is used with shared interrupts
Date 2017-06-04 15:00 +0200
Message-ID <tODip-5cy-11@gated-at.bofh.it> (permalink)
References <tN8JJ-3mG-35@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Commit-ID:  04c848d398797a626608ff48804d809ae6687163
Gitweb:     http://git.kernel.org/tip/04c848d398797a626608ff48804d809ae6687163
Author:     Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Wed, 31 May 2017 11:58:33 +0200
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Sun, 4 Jun 2017 14:38:41 +0200

genirq: Warn when IRQ_NOAUTOEN is used with shared interrupts

Shared interrupts do not go well with disabling auto enable:

1) The sharing interrupt might request it while it's still disabled and
   then wait for interrupts forever.

2) The interrupt might have been requested by the driver sharing the line
   before IRQ_NOAUTOEN has been set. So the driver which expects that
   disabled state after calling request_irq() will not get what it wants.
   Even worse, when it calls enable_irq() later, it will trigger the
   unbalanced enable_irq() warning.

Reported-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: dianders@chromium.org
Cc: jeffy <jeffy.chen@rock-chips.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: tfiga@chromium.org
Link: http://lkml.kernel.org/r/20170531100212.210682135@linutronix.de
---
 kernel/irq/chip.c   |  7 +++++++
 kernel/irq/manage.c | 12 ++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index e0051d5..bc1331f 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -935,6 +935,13 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)
 
 	if (!desc)
 		return;
+
+	/*
+	 * Warn when a driver sets the no autoenable flag on an already
+	 * active interrupt.
+	 */
+	WARN_ON_ONCE(!desc->depth && (set & _IRQ_NOAUTOEN));
+
 	irq_settings_clr_and_set(desc, clr, set);
 
 	irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 5705610..49c37f1 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1334,11 +1334,19 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 		if (new->flags & IRQF_ONESHOT)
 			desc->istate |= IRQS_ONESHOT;
 
-		if (irq_settings_can_autoenable(desc))
+		if (irq_settings_can_autoenable(desc)) {
 			irq_startup(desc, true);
-		else
+		} else {
+			/*
+			 * Shared interrupts do not go well with disabling
+			 * auto enable. The sharing interrupt might request
+			 * it while it's still disabled and then wait for
+			 * interrupts forever.
+			 */
+			WARN_ON_ONCE(new->flags & IRQF_SHARED);
 			/* Undo nested disables: */
 			desc->depth = 1;
+		}
 
 		/* Exclude IRQ from balancing if requested */
 		if (new->flags & IRQF_NOBALANCING) {

Back to linux.kernel | Previous | NextPrevious in thread | Find similar | Unroll thread


Thread

[patch 0/2] genirq: Handle NOAUTOEN interrupts correctly Thomas Gleixner <tglx@linutronix.de> - 2017-05-31 12:10 +0200
  [patch 1/2] genirq: Handle NOAUTOEN interrupt setup proper Thomas Gleixner <tglx@linutronix.de> - 2017-05-31 12:10 +0200
    Re: [patch 1/2] genirq: Handle NOAUTOEN interrupt setup proper Marc Zyngier <marc.zyngier@arm.com> - 2017-05-31 16:00 +0200
      Re: [patch 1/2] genirq: Handle NOAUTOEN interrupt setup proper Thomas Gleixner <tglx@linutronix.de> - 2017-05-31 17:20 +0200
    [tip:irq/core] genirq: Handle NOAUTOEN interrupt setup proper tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2017-06-04 15:00 +0200
  [patch 2/2] genirq: Warn when IRQ_NOAUTOEN is used with shared  interrupts Thomas Gleixner <tglx@linutronix.de> - 2017-05-31 12:10 +0200
    [tip:irq/core] genirq: Warn when IRQ_NOAUTOEN is used with shared  interrupts tip-bot for Thomas Gleixner <tipbot@zytor.com> - 2017-06-04 15:00 +0200

csiph-web