All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Wu <michael@allwinnertech.com>
To: ulf.hansson@linaro.org, linus.walleij@linaro.org, brgl@bgdev.pl,
	adrian.hunter@intel.com, avri.altman@wdc.com,
	wsa+renesas@sang-engineering.com, andy-ld.lu@mediatek.com,
	victor.shih@genesyslogic.com.tw
Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-gpio@vger.kernel.org
Subject: [PATCH] mmc: core: Fix system shutdown hang in mmc_bus_shutdown
Date: Fri, 26 Sep 2025 10:48:47 +0800	[thread overview]
Message-ID: <20250926024847.45814-1-michael@allwinnertech.com> (raw)

During system shutdown, mmc_bus_shutdown() calls __mmc_stop_host() which
uses cancel_delayed_work_sync(). This can block indefinitely if the work
queue is stuck, causing the system to hang during shutdown.

This patch introduces a new function __mmc_stop_host_no_sync() that skips
the synchronous work cancellation, preventing potential shutdown hangs.
The function is used in mmc_bus_shutdown() where blocking is not
acceptable during system shutdown.

Changes:
- Add __mmc_stop_host_no_sync() function that avoids cancel_delayed_work_sync()
- Update mmc_bus_shutdown() to use the new non-blocking function
- Keep the original __mmc_stop_host() unchanged for normal operation

This ensures graceful system shutdown while maintaining existing
functionality for regular MMC host operations.

stack information when an error occurs:
INFO: task init:1 blocked for more than 720 seconds.
      Tainted: G           OE     5.15.185-android13-8-00043-gd00fb6bce7ed-ab13792018 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
task:init            state:D stack:    0 pid:    1 ppid:     0 flags:0x04000008
Call trace:
 __switch_to+0x234/0x470
 __schedule+0x694/0xb8c
 schedule+0x150/0x254
 schedule_timeout+0x48/0x138
 wait_for_common+0x144/0x308
 __flush_work+0x3d8/0x508
 __cancel_work_timer+0x120/0x2e8
 mmc_bus_shutdown+0x90/0x158
 device_shutdown+0x204/0x434
 kernel_restart+0x54/0x220
 kernel_restart+0x0/0x220
 invoke_syscall+0x60/0x150
 el0_svc_common+0xb8/0xf8
 do_el0_svc+0x28/0x98
 el0_svc+0x24/0x84
 el0t_64_sync_handler+0x88/0xec
 el0t_64_sync+0x1b8/0x1bc
INFO: task kworker/1:1:73 blocked for more than 721 seconds.
      Tainted: G           OE     5.15.185-android13-8-00043-gd00fb6bce7ed-ab13792018 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
task:kworker/1:1     state:D stack:    0 pid:   73 ppid:     2 flags:0x00000008
Workqueue: events_freezable mmc_rescan.cfi_jt
Call trace:
 __switch_to+0x234/0x470
 __schedule+0x694/0xb8c
 schedule+0x150/0x254
 schedule_preempt_disabled+0x2c/0x4c
 __mutex_lock+0x360/0xb00
 __mutex_lock_slowpath+0x18/0x28
 mutex_lock+0x48/0x12c
 device_del+0x48/0x8d0
 mmc_remove_card+0x128/0x158
 mmc_sdio_remove+0x190/0x1ac
 mmc_sdio_detect+0x7c/0x118
 mmc_rescan+0xe8/0x42c
 process_one_work+0x248/0x55c
 worker_thread+0x3b0/0x740
 kthread+0x168/0x1dc
 ret_from_fork+0x10/0x20

Signed-off-by: Michael Wu <michael@allwinnertech.com>
---
 drivers/mmc/core/bus.c  |  2 +-
 drivers/mmc/core/core.c | 14 ++++++++++++++
 drivers/mmc/core/core.h |  1 +
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c
index 1cf64e0952fbe..6ff6fcb4c6f27 100644
--- a/drivers/mmc/core/bus.c
+++ b/drivers/mmc/core/bus.c
@@ -149,7 +149,7 @@ static void mmc_bus_shutdown(struct device *dev)
 	if (dev->driver && drv->shutdown)
 		drv->shutdown(card);
 
-	__mmc_stop_host(host);
+	__mmc_stop_host_no_sync(host);
 
 	if (host->bus_ops->shutdown) {
 		ret = host->bus_ops->shutdown(host);
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index a0e2dce704343..2d75ad26f84a9 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -2336,6 +2336,20 @@ void __mmc_stop_host(struct mmc_host *host)
 	cancel_delayed_work_sync(&host->detect);
 }
 
+void __mmc_stop_host_no_sync(struct mmc_host *host)
+{
+	if (host->rescan_disable)
+		return;
+
+	if (host->slot.cd_irq >= 0) {
+		mmc_gpio_set_cd_wake(host, false);
+		disable_irq(host->slot.cd_irq);
+	}
+
+	host->rescan_disable = 1;
+	/* Skip cancel_delayed_work_sync to avoid potential blocking */
+}
+
 void mmc_stop_host(struct mmc_host *host)
 {
 	__mmc_stop_host(host);
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 622085cd766f9..eb59a61717357 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -71,6 +71,7 @@ static inline void mmc_delay(unsigned int ms)
 void mmc_rescan(struct work_struct *work);
 void mmc_start_host(struct mmc_host *host);
 void __mmc_stop_host(struct mmc_host *host);
+void __mmc_stop_host_no_sync(struct mmc_host *host);
 void mmc_stop_host(struct mmc_host *host);
 
 void _mmc_detect_change(struct mmc_host *host, unsigned long delay,
-- 
2.29.0


             reply	other threads:[~2025-09-26  2:54 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-26  2:48 Michael Wu [this message]
2025-09-26 13:09 ` [PATCH] mmc: core: Fix system shutdown hang in mmc_bus_shutdown Ulf Hansson

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=20250926024847.45814-1-michael@allwinnertech.com \
    --to=michael@allwinnertech.com \
    --cc=adrian.hunter@intel.com \
    --cc=andy-ld.lu@mediatek.com \
    --cc=avri.altman@wdc.com \
    --cc=brgl@bgdev.pl \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=ulf.hansson@linaro.org \
    --cc=victor.shih@genesyslogic.com.tw \
    --cc=wsa+renesas@sang-engineering.com \
    /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.