All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Thomas Gleixner <tglx@linutronix.de>,
	Jason Cooper <jason@lakedaemon.net>,
	Marc Zyngier <marc.zyngier@arm.com>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>,
	Alexandre Belloni <alexandre.belloni@free-electrons.com>,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH v3 2/2] irqchip/atmel-aic: Fix potential deadlock in ->xlate()
Date: Tue, 13 Sep 2016 16:15:14 +0200	[thread overview]
Message-ID: <20160913161514.04592b46@bbrezillon> (raw)
In-Reply-To: <1473775109-4192-2-git-send-email-boris.brezillon@free-electrons.com>

On Tue, 13 Sep 2016 15:58:29 +0200
Boris Brezillon <boris.brezillon@free-electrons.com> wrote:

> 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
> raw_spin_{lock_irqsave,unlock_irqrestore}() ones to prevent this bug from

Sorry, I forgot to update my commit message: s/raw_spin_/irq_gc_/.
Thomas, can you fix that when applying, or should I send a new version?

> happening.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> Fixes: b1479ebb7720 ("irqchip: atmel-aic: Add atmel AIC/AIC5 drivers")
> Cc: <stable@vger.kernel.org>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
> Changes in v3:
> - introduce and use the irq_gc_{lock_irqsave,unlock_irqrestore}() helpers
> 
> Changes in v2:
> - add Marc's ack
> - fix stable ML address
> 
> fixup! irqchip/atmel-aic: Fix potential deadlock in ->xlate()
> ---
>  drivers/irqchip/irq-atmel-aic.c  | 5 +++--
>  drivers/irqchip/irq-atmel-aic5.c | 5 +++--
>  2 files changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-atmel-aic.c b/drivers/irqchip/irq-atmel-aic.c
> index 112e17c2768b..37f952dd9fc9 100644
> --- a/drivers/irqchip/irq-atmel-aic.c
> +++ b/drivers/irqchip/irq-atmel-aic.c
> @@ -176,6 +176,7 @@ static int aic_irq_domain_xlate(struct irq_domain *d,
>  {
>  	struct irq_domain_chip_generic *dgc = d->gc;
>  	struct irq_chip_generic *gc;
> +	unsigned long flags;
>  	unsigned smr;
>  	int idx;
>  	int ret;
> @@ -194,11 +195,11 @@ static int aic_irq_domain_xlate(struct irq_domain *d,
>  
>  	gc = dgc->gc[idx];
>  
> -	irq_gc_lock(gc);
> +	irq_gc_lock_irqsave(gc, flags);
>  	smr = irq_reg_readl(gc, AT91_AIC_SMR(*out_hwirq));
>  	aic_common_set_priority(intspec[2], &smr);
>  	irq_reg_writel(gc, smr, AT91_AIC_SMR(*out_hwirq));
> -	irq_gc_unlock(gc);
> +	irq_gc_unlock_irqrestore(gc, flags);
>  
>  	return ret;
>  }
> diff --git a/drivers/irqchip/irq-atmel-aic5.c b/drivers/irqchip/irq-atmel-aic5.c
> index 4f0d068e1abe..2a624d87a035 100644
> --- a/drivers/irqchip/irq-atmel-aic5.c
> +++ b/drivers/irqchip/irq-atmel-aic5.c
> @@ -258,6 +258,7 @@ static int aic5_irq_domain_xlate(struct irq_domain *d,
>  				 unsigned int *out_type)
>  {
>  	struct irq_chip_generic *bgc = irq_get_domain_generic_chip(d, 0);
> +	unsigned long flags;
>  	unsigned smr;
>  	int ret;
>  
> @@ -269,12 +270,12 @@ static int aic5_irq_domain_xlate(struct irq_domain *d,
>  	if (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);
>  	aic_common_set_priority(intspec[2], &smr);
>  	irq_reg_writel(bgc, smr, AT91_AIC5_SMR);
> -	irq_gc_unlock(bgc);
> +	irq_gc_unlock_irqrestore(bgc, flags);
>  
>  	return ret;
>  }

  reply	other threads:[~2016-09-13 14:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-13 13:58 [PATCH v3 1/2] genirq: Provide irq_gc_{lock_irqsave,unlock_irqrestore}() helpers Boris Brezillon
2016-09-13 13:58 ` [PATCH v3 2/2] irqchip/atmel-aic: Fix potential deadlock in ->xlate() Boris Brezillon
2016-09-13 14:15   ` Boris Brezillon [this message]
2016-09-13 15:04   ` [tip:irq/urgent] " tip-bot for Boris Brezillon
2016-09-13 15:04 ` [tip:irq/urgent] genirq: Provide irq_gc_{lock_irqsave,unlock_irqrestore}() helpers tip-bot for Boris Brezillon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160913161514.04592b46@bbrezillon \
    --to=boris.brezillon@free-electrons.com \
    --cc=alexandre.belloni@free-electrons.com \
    --cc=jason@lakedaemon.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=nicolas.ferre@atmel.com \
    --cc=stable@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.