From: Heiner Kallweit <hkallweit1@gmail.com>
To: Peter Suti <peter.suti@streamunlimited.com>,
Ulf Hansson <ulf.hansson@linaro.org>,
Neil Armstrong <neil.armstrong@linaro.org>,
Kevin Hilman <khilman@baylibre.com>,
Jerome Brunet <jbrunet@baylibre.com>,
Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Cc: linux-mmc@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] mmc: meson-gx: fix SDIO interrupt handling
Date: Tue, 22 Nov 2022 22:41:30 +0100 [thread overview]
Message-ID: <52861a84-0fe2-37f0-d66a-145f2ebe1d79@gmail.com> (raw)
In-Reply-To: <20221122132304.1482508-1-peter.suti@streamunlimited.com>
On 22.11.2022 14:23, Peter Suti wrote:
> With the interrupt support introduced in commit 066ecde sometimes the
> Marvell-8987 wifi chip entered a deadlock using the marvell-sd-uapsta-8987
> vendor driver. The cause seems to be that sometimes the interrupt handler
> handles 2 IRQs and one of them disables the interrupts which are not reenabled
> when all interrupts are finished. To work around this, disable all interrupts
> when we are in the IRQ context and reenable them when the current IRQ is handled.
>
To me it's still not clear what you mean with "handles 2 IRQs".
Hard irq handlers aren't re-entrant. Can you provide the exact call sequence
for the issue you're facing?
Are SDIO interrupts handled on more than one CPU in your case?
Are you concerned about the hard irq handler running in parallel on more than one CPU?
The proposed patch looks hacky and somewhat bypasses the SDIO core logic
by partially re-enabling SDIO interrupts in the hard irq handler.
In the first review round I wrote the following but didn't see a feedback yet.
Did you check the linked discussion whether it may be related to your issue?
-> IIRC I had a similar/same problem in mind when discussing the following:
-> https://lore.kernel.org/linux-arm-kernel/CAPDyKFoameOb7d3cn8_ki1O6DbMEAFvkQh1uUsYp4S-Lkq41oQ@mail.gmail.com/
-> Not sure though whether it's related to the issue you're facing.
> Fixes: 066ecde ("mmc: meson-gx: add SDIO interrupt support")
>
> Signed-off-by: Peter Suti <peter.suti@streamunlimited.com>
> ---
> Changes in v2:
> - use spin_lock instead of spin_lock_irqsave
> - only reenable interrupts if they were enabled already
>
> drivers/mmc/host/meson-gx-mmc.c | 30 +++++++++++++++++++++++-------
> 1 file changed, 23 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
> index 6e5ea0213b47..0c95f8640b34 100644
> --- a/drivers/mmc/host/meson-gx-mmc.c
> +++ b/drivers/mmc/host/meson-gx-mmc.c
> @@ -934,6 +934,13 @@ static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)
> }
> }
>
> +static bool __meson_mmc_sdio_irq_is_enabled(struct mmc_host *mmc)
> +{
> + struct meson_host *host = mmc_priv(mmc);
> +
> + return readl(host->regs + SD_EMMC_IRQ_EN) & IRQ_SDIO;
> +}
> +
> static void __meson_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
> {
> struct meson_host *host = mmc_priv(mmc);
> @@ -950,6 +957,11 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
> struct mmc_command *cmd;
> u32 status, raw_status;
> irqreturn_t ret = IRQ_NONE;
> + bool irq_enabled;
> +
> + spin_lock(&host->lock);
> + irq_enabled = __meson_mmc_sdio_irq_is_enabled(host->mmc);
> + __meson_mmc_enable_sdio_irq(host->mmc, 0);
>
> raw_status = readl(host->regs + SD_EMMC_STATUS);
> status = raw_status & (IRQ_EN_MASK | IRQ_SDIO);
> @@ -958,11 +970,11 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
> dev_dbg(host->dev,
> "Unexpected IRQ! irq_en 0x%08lx - status 0x%08x\n",
> IRQ_EN_MASK | IRQ_SDIO, raw_status);
> - return IRQ_NONE;
> + goto out_unlock;
> }
>
> if (WARN_ON(!host))
> - return IRQ_NONE;
> + goto out_unlock;
>
> /* ack all raised interrupts */
> writel(status, host->regs + SD_EMMC_STATUS);
> @@ -970,17 +982,16 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
> cmd = host->cmd;
>
> if (status & IRQ_SDIO) {
> - spin_lock(&host->lock);
> - __meson_mmc_enable_sdio_irq(host->mmc, 0);
> sdio_signal_irq(host->mmc);
> - spin_unlock(&host->lock);
> status &= ~IRQ_SDIO;
> - if (!status)
> + if (!status) {
> + spin_unlock(&host->lock);
> return IRQ_HANDLED;
> + }
> }
>
> if (WARN_ON(!cmd))
> - return IRQ_NONE;
> + goto out_unlock;
>
> cmd->error = 0;
> if (status & IRQ_CRC_ERR) {
> @@ -1023,6 +1034,11 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
> if (ret == IRQ_HANDLED)
> meson_mmc_request_done(host->mmc, cmd->mrq);
>
> +out_unlock:
> + if (irq_enabled)
> + __meson_mmc_enable_sdio_irq(host->mmc, 1);
> + spin_unlock(&host->lock);
> +
> return ret;
> }
>
next prev parent reply other threads:[~2022-11-22 21:42 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-14 9:38 [PATCH] mmc: meson-gx: fix SDIO interrupt handling Peter Suti
2022-11-14 21:33 ` Heiner Kallweit
2022-11-16 16:13 ` Ulf Hansson
2022-11-22 13:23 ` [PATCH v2] " Peter Suti
2022-11-22 15:19 ` Ulf Hansson
2022-11-22 21:41 ` Heiner Kallweit [this message]
2022-12-14 13:46 ` [PATCH v3] " Peter Suti
2022-12-14 21:33 ` Heiner Kallweit
2023-01-09 11:52 ` Peter Suti
2023-01-12 21:27 ` Heiner Kallweit
2023-01-18 13:32 ` Peter Suti
2023-01-19 7:53 ` Heiner Kallweit
2023-01-19 19:37 ` Heiner Kallweit
2023-01-24 7:29 ` Peter Suti
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=52861a84-0fe2-37f0-d66a-145f2ebe1d79@gmail.com \
--to=hkallweit1@gmail.com \
--cc=jbrunet@baylibre.com \
--cc=khilman@baylibre.com \
--cc=linux-amlogic@lists.infradead.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=martin.blumenstingl@googlemail.com \
--cc=neil.armstrong@linaro.org \
--cc=peter.suti@streamunlimited.com \
--cc=ulf.hansson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox