Patch "irqchip/mips-gic: Cleanup chip and handler setup" has been added to the 4.7-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
irqchip/mips-gic: Cleanup chip and handler setup
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
irqchip-mips-gic-cleanup-chip-and-handler-setup.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6a33fa2b87513fee44cb8f0cd17b1acd6316bc6bMon Sep 17 00:00:00 2001
From: Paul Burton <[email protected]>
Date: Fri, 19 Aug 2016 18:07:14 +0100
Subject: irqchip/mips-gic: Cleanup chip and handler setup
From: Paul Burton <[email protected]>
commit 6a33fa2b87513fee44cb8f0cd17b1acd6316bc6b upstream.
gic_shared_irq_domain_map() is called from gic_irq_domain_alloc() where the wrong chip has been set, and is then overwritten. Tidy this up by setting the correct chip the first time, and setting the handle_level_irq handler from gic_irq_domain_alloc() too.
gic_shared_irq_domain_map() is also called from gic_irq_domain_map(), which now calls irq_set_chip_and_handler() to retain its previous behaviour.
This patch prepares for a follow-on which will call gic_shared_irq_domain_map() from a callback where the lock on the struct irq_desc is held, which without this change would cause the call to irq_set_chip_and_handler() to lead to a deadlock.
--- drivers/irqchip/irq-mips-gic.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/irqchip/irq-mips-gic.c +7 -4
@@ -713,9 +713,6 @@ static int gic_shared_irq_domain_map(strunsigned long flags;int i; -irq_set_chip_and_handler (virq, &gic_level_irq_controller, - handle_level_irq); -spin_lock_irqsave (&gic_lock, flags);gic_map_to_pin (intr, gic_cpu_pin);gic_map_to_vpe (intr,mips_cm_vp_id (vpe));
@@ -732,6 +729,10 @@ static int gic_irq_domain_map(struct irq {if (GIC_HWIRQ_TO_LOCAL (hw) <GIC_NUM_LOCAL_INTRS )return gic_local_irq_domain_map (d, virq, hw); + +irq_set_chip_and_handler (virq, &gic_level_irq_controller, + handle_level_irq); +return gic_shared_irq_domain_map (d, virq, hw,0 ); }
@@ -771,11 +772,13 @@ static int gic_irq_domain_alloc(struct i hwirq =GIC_SHARED_TO_HWIRQ (base_hwirq + i); ret =irq_domain_set_hwirq_and_chip (d, virq + i, hwirq, - &gic_edge_irq_controller, + &gic_level_irq_controller,NULL );if (ret) goto error; +irq_set_handler (virq + i, handle_level_irq); + ret =gic_shared_irq_domain_map (d, virq + i, hwirq, cpu);if (ret) goto error;
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/irqchip-mips-gic-implement-activate-op-for-device-domain.patch queue-4.7/irqchip-mips-gic-cleanup-chip-and-handler-setup.patch