All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee@kernel.org>
To: Chengfeng Ye <dg573847474@gmail.com>
Cc: agross@kernel.org, andersson@kernel.org,
	konrad.dybcio@linaro.org, linux-arm-msm@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mfd: qcom-pm8xxx: Fix potential deadlock on &chip->pm_irq_lock
Date: Thu, 13 Jul 2023 11:18:48 +0100	[thread overview]
Message-ID: <20230713101848.GM10768@google.com> (raw)
In-Reply-To: <20230628072840.28587-1-dg573847474@gmail.com>

I'd like some additional eyes-on please.

This is very old code that you're changing and some of the people who
made the largest contributions are not on Cc.

On Wed, 28 Jun 2023, Chengfeng Ye wrote:
> As &chip->pm_irq_lock is acquired by pm8xxx_irq_handler() under irq
> context, other process context code should disable irq before acquiring
> the lock.
> 
> I think .irq_set_type and .irq_get_irqchip_state callbacks should be
> executed from process context without irq disabled by default. Thus the
> same lock acquision should disable irq.
> 
> Possible deadlock scenario
> pm8xxx_irq_set_type()
>     -> pm8xxx_config_irq()
>     -> spin_lock(&chip->pm_irq_lock)
>         <irq interrupt>
>         -> pm8xxx_irq_handler()
>         -> pm8xxx_irq_master_handler()
>         -> pm8xxx_irq_block_handler()
>         -> pm8xxx_read_block_irq()
>         -> spin_lock(&chip->pm_irq_lock) (deadlock here)
> 
> This flaw was found using an experimental static analysis tool we are
> developing for irq-related deadlock.
> 
> The tentative patch fix the potential deadlock by spin_lock_irqsave().
> 
> Signed-off-by: Chengfeng Ye <dg573847474@gmail.com>
> ---
>  drivers/mfd/qcom-pm8xxx.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/mfd/qcom-pm8xxx.c b/drivers/mfd/qcom-pm8xxx.c
> index 9a948df8c28d..07c531bd1236 100644
> --- a/drivers/mfd/qcom-pm8xxx.c
> +++ b/drivers/mfd/qcom-pm8xxx.c
> @@ -103,8 +103,9 @@ static int
>  pm8xxx_config_irq(struct pm_irq_chip *chip, unsigned int bp, unsigned int cp)
>  {
>  	int	rc;
> +	unsigned long flags;
>  
> -	spin_lock(&chip->pm_irq_lock);
> +	spin_lock_irqsave(&chip->pm_irq_lock, flags);
>  	rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_BLK_SEL, bp);
>  	if (rc) {
>  		pr_err("Failed Selecting Block %d rc=%d\n", bp, rc);
> @@ -116,7 +117,7 @@ pm8xxx_config_irq(struct pm_irq_chip *chip, unsigned int bp, unsigned int cp)
>  	if (rc)
>  		pr_err("Failed Configuring IRQ rc=%d\n", rc);
>  bail:
> -	spin_unlock(&chip->pm_irq_lock);
> +	spin_unlock_irqrestore(&chip->pm_irq_lock, flags);
>  	return rc;
>  }
>  
> @@ -321,6 +322,7 @@ static int pm8xxx_irq_get_irqchip_state(struct irq_data *d,
>  	struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d);
>  	unsigned int pmirq = irqd_to_hwirq(d);
>  	unsigned int bits;
> +	unsigned long flags;
>  	int irq_bit;
>  	u8 block;
>  	int rc;
> @@ -331,7 +333,7 @@ static int pm8xxx_irq_get_irqchip_state(struct irq_data *d,
>  	block = pmirq / 8;
>  	irq_bit = pmirq % 8;
>  
> -	spin_lock(&chip->pm_irq_lock);
> +	spin_lock_irqsave(&chip->pm_irq_lock, flags);
>  	rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_BLK_SEL, block);
>  	if (rc) {
>  		pr_err("Failed Selecting Block %d rc=%d\n", block, rc);
> @@ -346,7 +348,7 @@ static int pm8xxx_irq_get_irqchip_state(struct irq_data *d,
>  
>  	*state = !!(bits & BIT(irq_bit));
>  bail:
> -	spin_unlock(&chip->pm_irq_lock);
> +	spin_unlock_irqrestore(&chip->pm_irq_lock, flags);
>  
>  	return rc;
>  }
> -- 
> 2.17.1
> 

-- 
Lee Jones [李琼斯]

  reply	other threads:[~2023-07-13 10:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-28  7:28 [PATCH] mfd: qcom-pm8xxx: Fix potential deadlock on &chip->pm_irq_lock Chengfeng Ye
2023-07-13 10:18 ` Lee Jones [this message]
2023-07-18  7:42   ` Chengfeng Ye
2023-07-19  8:53     ` Lee Jones
2023-07-19 15:18 ` Bjorn Andersson
2023-07-20  7:24   ` Chengfeng Ye

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=20230713101848.GM10768@google.com \
    --to=lee@kernel.org \
    --cc=agross@kernel.org \
    --cc=andersson@kernel.org \
    --cc=dg573847474@gmail.com \
    --cc=konrad.dybcio@linaro.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /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.