From: Adrian Hunter <adrian.hunter@intel.com>
To: Andrew Bresticker <abrestic@chromium.org>
Cc: Chris Ball <chris@printf.net>,
Ulf Hansson <ulf.hansson@linaro.org>,
linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH V2] mmc: sdhci: don't read cd-gpio while holding spinlock
Date: Mon, 24 Mar 2014 08:19:33 +0200 [thread overview]
Message-ID: <532FCE75.6010004@intel.com> (raw)
In-Reply-To: <1395625380-12507-1-git-send-email-abrestic@chromium.org>
On 24.03.2014 03:43, Andrew Bresticker wrote:
> sdhci_request() and sdhci_card_event() read the cd-gpio via
> mmc_gpio_get_cd(), which can sleep, while holding host->lock.
> This may result in the following BUG:
>
> BUG: spinlock wrong CPU on CPU#2, kworker/u8:16/4296
> lock: 0xea6b9c80, .magic: dead4ead, .owner: kworker/u8:16/4296, .owner_cpu: 0
> CPU: 2 PID: 4296 Comm: kworker/u8:16 Tainted: G C 3.10.18 #137
> Workqueue: kmmcd mmc_rescan
> [<8020cf8c>] (unwind_backtrace+0x0/0x118) from [<8020a0c8>] (show_stack+0x20/0x24)
> [<8020a0c8>] (show_stack+0x20/0x24) from [<8075e5b8>] (dump_stack+0x20/0x28)
> [<8075e5b8>] (dump_stack+0x20/0x28) from [<804184a8>] (spin_dump+0x80/0x94)
> [<804184a8>] (spin_dump+0x80/0x94) from [<804184e8>] (spin_bug+0x2c/0x30)
> [<804184e8>] (spin_bug+0x2c/0x30) from [<80418790>] (do_raw_spin_unlock+0x94/0xd4)
> [<80418790>] (do_raw_spin_unlock+0x94/0xd4) from [<80761a44>] (_raw_spin_unlock_irqrestore+0x1c/0x24)
> [<80761a44>] (_raw_spin_unlock_irqrestore+0x1c/0x24) from [<805ff66c>] (sdhci_request+0x1c8/0x1d0)
> [<805ff66c>] (sdhci_request+0x1c8/0x1d0) from [<805ebb5c>] (mmc_start_request+0xec/0xf4)
> [<805ebb5c>] (mmc_start_request+0xec/0xf4) from [<805ebcbc>] (mmc_wait_for_req+0x80/0xf4)
> ...
>
> Read the cd-gpio before acquiring the spinlock instead.
>
> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
> ---
> drivers/mmc/host/sdhci.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 04a5e25..328b250 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -1340,6 +1340,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
> u32 tuning_opcode;
>
> host = mmc_priv(mmc);
> + present = mmc_gpio_get_cd(host->mmc);
>
> sdhci_runtime_pm_get(host);
>
> @@ -1371,7 +1372,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
> * zero: cd-gpio is used, and card is removed
> * one: cd-gpio is used, and card is present
> */
> - present = mmc_gpio_get_cd(host->mmc);
> if (present < 0) {
> /* If polling, assume that the card is always present. */
> if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
> @@ -2082,15 +2082,16 @@ static void sdhci_card_event(struct mmc_host *mmc)
> {
> struct sdhci_host *host = mmc_priv(mmc);
> unsigned long flags;
> + int present;
>
> /* First check if client has provided their own card event */
> if (host->ops->card_event)
> host->ops->card_event(host);
>
> + present = sdhci_get_cd(mmc);
Shouldn't that be sdhci_do_get_cd(mmc) ?
> spin_lock_irqsave(&host->lock, flags);
>
> - /* Check host->mrq first in case we are runtime suspended */
> - if (host->mrq && !sdhci_do_get_cd(host)) {
> + if (host->mrq && !present) {
> pr_err("%s: Card removed during transfer!\n",
> mmc_hostname(host->mmc));
> pr_err("%s: Resetting controller.\n",
>
next prev parent reply other threads:[~2014-03-24 6:20 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-20 18:47 [PATCH] mmc: sdhci: don't read cd-gpio while holding spinlock Andrew Bresticker
2014-03-21 6:45 ` Adrian Hunter
2014-03-22 1:38 ` Andrew Bresticker
2014-03-24 1:43 ` [PATCH V2] " Andrew Bresticker
2014-03-24 6:19 ` Adrian Hunter [this message]
2014-03-24 16:18 ` Andrew Bresticker
2014-03-25 8:25 ` Adrian Hunter
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=532FCE75.6010004@intel.com \
--to=adrian.hunter@intel.com \
--cc=abrestic@chromium.org \
--cc=chris@printf.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--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 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.