Patch "genirq: Restore trigger settings in irq_modify_status()" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
genirq: Restore trigger settings in irq_modify_status()
to the 4.9-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:
genirq-restore-trigger-settings-in-irq_modify_status.patch
and it can be found in the queue-4.9 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
e8f241893dfbbebe2813c01eac54f263e6a5e59cMon Sep 17 00:00:00 2001
From: Marc Zyngier <[email protected]>
Date: Fri, 18 Aug 2017 10:53:45 +0100
Subject: genirq: Restore trigger settings in irq_modify_status()
From: Marc Zyngier <[email protected]>
commit e8f241893dfbbebe2813c01eac54f263e6a5e59c upstream.
irq_modify_status starts by clearing the trigger settings from irq_data before applying the new settings, but doesn't restore them, leaving them to IRQ_TYPE_NONE.
That's pretty confusing to the potential request_irq() that could follow. Instead, snapshot the settings before clearing them, and restore them if the irq_modify_status() invocation was not changing the trigger.
--- kernel/irq/chip.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
kernel/irq/chip.c +8 -2
@@ -895,13 +895,15 @@ EXPORT_SYMBOL_GPL(irq_set_chip_and_handlvoid irq_modify_status (unsigned int irq,unsigned long clr,unsigned long set) { -unsigned long flags; +unsigned long flags, trigger, tmp;struct irq_desc *desc =irq_get_desc_lock (irq, &flags,0 );if (!desc)return ;irq_settings_clr_and_set (desc, clr, set); + trigger =irqd_get_trigger_type (&desc->irq_data); +irqd_clear (&desc->irq_data,IRQD_NO_BALANCING |IRQD_PER_CPU |IRQD_TRIGGER_MASK |IRQD_LEVEL |IRQD_MOVE_PCNTXT );if (irq_settings_has_no_balance_set (desc))
@@ -913,7 +915,11 @@ void irq_modify_status(unsigned int irq,if (irq_settings_is_level (desc))irqd_set (&desc->irq_data,IRQD_LEVEL ); -irqd_set (&desc->irq_data,irq_settings_get_trigger_mask (desc)); + tmp =irq_settings_get_trigger_mask (desc); +if (tmp !=IRQ_TYPE_NONE ) + trigger = tmp; + +irqd_set (&desc->irq_data, trigger);irq_put_desc_unlock (desc, flags); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/genirq-restore-trigger-settings-in-irq_modify_status.patch queue-4.9/irqchip-atmel-aic-fix-unbalanced-of_node_put-in-aic_common_irq_fixup.patch queue-4.9/irqchip-atmel-aic-fix-unbalanced-refcount-in-aic_common_rtc_irq_fixup.patch