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


Groups > linux.kernel > #1460640 > unrolled thread

[PATCH] genirq: Correctly configure the trigger on chained interrupts

Started byMarc Zyngier <marc.zyngier@arm.com>
First post2016-08-11 18:00 +0200
Last post2016-08-11 23:10 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] genirq: Correctly configure the trigger on chained interrupts Marc Zyngier <marc.zyngier@arm.com> - 2016-08-11 18:00 +0200
    Re: [PATCH] genirq: Correctly configure the trigger on chained interrupts Linus Walleij <linus.walleij@linaro.org> - 2016-08-11 23:10 +0200

#1460640 — [PATCH] genirq: Correctly configure the trigger on chained interrupts

FromMarc Zyngier <marc.zyngier@arm.com>
Date2016-08-11 18:00 +0200
Subject[PATCH] genirq: Correctly configure the trigger on chained interrupts
Message-ID<s50yK-5KE-27@gated-at.bofh.it>
Commit 1e2a7d78499e ("irqdomain: Don't set type when mapping an IRQ")
moved the trigger configuration call from the irqdomain mapping to
the interrupt being actually requested.

This patch failed to handle the case where we configure a chained
interrupt, which doesn't get requested through the usual path.

In order to solve this, let's call __irq_set_trigger just before
starting the cascade interrupt. Special care must be taken to
make the flow handler stick, as the .irq_set_type method could
have reset it (it doesn't know we're dealing with a chained
interrupt).

Based on an initial patch by Jon Hunter.

Fixes: 1e2a7d78499e ("irqdomain: Don't set type when mapping an IRQ")
Reported-by: John Stultz <john.stultz@linaro.org>
Reported-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: John Stultz <john.stultz@linaro.org>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 kernel/irq/chip.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index b4c1bc7..6373890 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -820,6 +820,17 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
 	desc->name = name;
 
 	if (handle != handle_bad_irq && is_chained) {
+		/*
+		 * We're about to start this interrupt immediately,
+		 * hence the need to set the trigger configuration.
+		 * But the .set_type callback may have overridden the
+		 * flow handler, ignoring that we're dealing with a
+		 * chained interrupt. Reset it immediately because we
+		 * do know better.
+		 */
+		__irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data));
+		desc->handle_irq = handle;
+
 		irq_settings_set_noprobe(desc);
 		irq_settings_set_norequest(desc);
 		irq_settings_set_nothread(desc);
-- 
2.1.4

[toc] | [next] | [standalone]


#1460793

FromLinus Walleij <linus.walleij@linaro.org>
Date2016-08-11 23:10 +0200
Message-ID<s55oJ-JH-3@gated-at.bofh.it>
In reply to#1460640
On Thu, Aug 11, 2016 at 5:55 PM, Marc Zyngier <marc.zyngier@arm.com> wrote:

> Commit 1e2a7d78499e ("irqdomain: Don't set type when mapping an IRQ")
> moved the trigger configuration call from the irqdomain mapping to
> the interrupt being actually requested.
>
> This patch failed to handle the case where we configure a chained
> interrupt, which doesn't get requested through the usual path.
>
> In order to solve this, let's call __irq_set_trigger just before
> starting the cascade interrupt. Special care must be taken to
> make the flow handler stick, as the .irq_set_type method could
> have reset it (it doesn't know we're dealing with a chained
> interrupt).
>
> Based on an initial patch by Jon Hunter.
>
> Fixes: 1e2a7d78499e ("irqdomain: Don't set type when mapping an IRQ")
> Reported-by: John Stultz <john.stultz@linaro.org>
> Reported-by: Linus Walleij <linus.walleij@linaro.org>
> Tested-by: John Stultz <john.stultz@linaro.org>
> Acked-by: Jon Hunter <jonathanh@nvidia.com>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>

Tested-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web