Patch "irqchip/atmel-aic: Fix potential deadlock in ->xlate()" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
irqchip/atmel-aic: Fix potential deadlock in ->xlate()
to the 4.4-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-atmel-aic-fix-potential-deadlock-in-xlate.patch
and it can be found in the queue-4.4 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
5eb0d6eb3fac3daa60d9190eed9fa41cf809c756Mon Sep 17 00:00:00 2001
From: Boris Brezillon <[email protected]>
Date: Tue, 13 Sep 2016 15:58:29 +0200
Subject: irqchip/atmel-aic: Fix potential deadlock in ->xlate()
From: Boris Brezillon <[email protected]>
commit 5eb0d6eb3fac3daa60d9190eed9fa41cf809c756 upstream.
aic5_irq_domain_xlate() and aic_irq_domain_xlate() take the generic chip lock without disabling interrupts, which can lead to a deadlock if an interrupt occurs while the lock is held in one of these functions.
Replace irq_gc_{lock,unlock}() calls by irq_gc_{lock_irqsave,unlock_irqrestore}() ones to prevent this bug from happening.
--- drivers/irqchip/irq-atmel-aic.c | 5 +++-- drivers/irqchip/irq-atmel-aic5.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
drivers/irqchip/irq-atmel-aic.c +3 -2
@@ -176,6 +176,7 @@ static int aic_irq_domain_xlate(struct i {struct irq_domain_chip_generic *dgc = d->gc;struct irq_chip_generic *gc; +unsigned long flags;unsigned smr;int idx;int ret;
@@ -194,12 +195,12 @@ static int aic_irq_domain_xlate(struct i gc = dgc->gc[idx]; -irq_gc_lock (gc); +irq_gc_lock_irqsave (gc, flags); smr =irq_reg_readl (gc,AT91_AIC_SMR (*out_hwirq)); ret =aic_common_set_priority (intspec[2 ], &smr);if (!ret)irq_reg_writel (gc, smr,AT91_AIC_SMR (*out_hwirq)); -irq_gc_unlock (gc); +irq_gc_unlock_irqrestore (gc, flags);return ret; }
drivers/irqchip/irq-atmel-aic5.c +3 -2
@@ -258,6 +258,7 @@ static int aic5_irq_domain_xlate(struct unsigned int *out_type) {struct irq_chip_generic *bgc =irq_get_domain_generic_chip (d,0 ); +unsigned long flags;unsigned smr;int ret;
@@ -269,13 +270,13 @@ static int aic5_irq_domain_xlate(structif (ret)return ret; -irq_gc_lock (bgc); +irq_gc_lock_irqsave (bgc, flags);irq_reg_writel (bgc, *out_hwirq,AT91_AIC5_SSR ); smr =irq_reg_readl (bgc,AT91_AIC5_SMR ); ret =aic_common_set_priority (intspec[2 ], &smr);if (!ret)irq_reg_writel (bgc, intspec[2 ] | smr,AT91_AIC5_SMR ); -irq_gc_unlock (bgc); +irq_gc_unlock_irqrestore (bgc, flags);return ret; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/irqchip-atmel-aic-fix-potential-deadlock-in-xlate.patch queue-4.4/drm-atmel-hlcdc-fix-vertical-scaling.patch queue-4.4/genirq-provide-irq_gc_-lock_irqsave-unlock_irqrestore-helpers.patch