From: Sasha Levin <sashal@kernel.org>
To: patches@lists.linux.dev, stable@vger.kernel.org
Cc: Ulf Hansson <ulf.hansson@linaro.org>,
Avri Altman <avri.altman@sandisk.com>,
Ricky Wu <ricky_wu@realtek.com>, Sasha Levin <sashal@kernel.org>,
zhoubinbin@loongson.cn, wsa+renesas@sang-engineering.com,
viro@zeniv.linux.org.uk, nathan@kernel.org,
u.kleine-koenig@baylibre.com
Subject: [PATCH AUTOSEL 6.1 34/51] mmc: rtsx_usb_sdmmc: Fix error-path in sd_set_power_mode()
Date: Sun, 3 Aug 2025 20:36:26 -0400 [thread overview]
Message-ID: <20250804003643.3625204-34-sashal@kernel.org> (raw)
In-Reply-To: <20250804003643.3625204-1-sashal@kernel.org>
From: Ulf Hansson <ulf.hansson@linaro.org>
[ Upstream commit 47a255f7d2eabee06cfbf5b1c2379749442fd01d ]
In the error path of sd_set_power_mode() we don't update host->power_mode,
which could lead to an imbalance of the runtime PM usage count. Fix this by
always updating host->power_mode.
Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Ricky Wu <ricky_wu@realtek.com>
Link: https://lore.kernel.org/r/20250610111633.504366-2-ulf.hansson@linaro.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
LLM Generated explanations, may be completely bogus:
**YES**
This commit should be backported to stable kernel trees. Here's my
extensive analysis:
## Bug Analysis
The commit fixes a **runtime PM reference counting bug** in the
`sd_set_power_mode()` function. The issue is in the error handling path:
### Original Code Problem:
```c
if (power_mode == MMC_POWER_OFF) {
err = sd_power_off(host);
pm_runtime_put_noidle(sdmmc_dev(host));
} else {
pm_runtime_get_noresume(sdmmc_dev(host));
err = sd_power_on(host);
}
if (!err)
host->power_mode = power_mode; // Only updated on success
```
### The Bug:
1. When transitioning to `MMC_POWER_OFF`, the code calls
`pm_runtime_put_noidle()` **regardless** of whether `sd_power_off()`
succeeded
2. When transitioning to `MMC_POWER_ON`, the code calls
`pm_runtime_get_noresume()` **before** calling `sd_power_on()`
3. However, `host->power_mode` is only updated if there's no error
This creates a **runtime PM reference count imbalance** because:
- If `sd_power_off()` fails, the runtime PM reference is still
decremented, but `host->power_mode` remains at its previous value
(likely `MMC_POWER_ON`)
- If `sd_power_on()` fails, the runtime PM reference is still
incremented, but `host->power_mode` remains at its previous value
(likely `MMC_POWER_OFF`)
- The early return check `if (power_mode == host->power_mode)` at the
beginning of the function will prevent future attempts to fix the
power state, leaving the runtime PM count permanently imbalanced
## Why This Is Suitable for Stable:
1. **Fixes a real bug**: Runtime PM reference count imbalances can lead
to:
- Device staying powered when it should be suspended
- Device being suspended when it should be active
- Power management failures
- Potential system hangs or crashes
2. **Minimal change**: The fix is a simple one-liner that always updates
`host->power_mode` regardless of error status
3. **Low regression risk**:
- The change doesn't introduce new functionality
- It doesn't alter the control flow
- It simply ensures state consistency
4. **Clear bug fix**: This is not a feature addition or optimization -
it's fixing incorrect error handling that violates runtime PM rules
5. **Affects users**: This bug can manifest in real-world scenarios when
SD card power operations fail, particularly with flaky hardware or
during system stress
6. **Subsystem contained**: The fix is limited to a single MMC host
driver and doesn't affect core kernel infrastructure
The commit follows stable kernel rules by being a minimal, targeted fix
for a real bug that can affect system stability and power management.
drivers/mmc/host/rtsx_usb_sdmmc.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/mmc/host/rtsx_usb_sdmmc.c b/drivers/mmc/host/rtsx_usb_sdmmc.c
index 2c650cd58693..c5a6bbc06953 100644
--- a/drivers/mmc/host/rtsx_usb_sdmmc.c
+++ b/drivers/mmc/host/rtsx_usb_sdmmc.c
@@ -1032,9 +1032,7 @@ static int sd_set_power_mode(struct rtsx_usb_sdmmc *host,
err = sd_power_on(host);
}
- if (!err)
- host->power_mode = power_mode;
-
+ host->power_mode = power_mode;
return err;
}
--
2.39.5
next prev parent reply other threads:[~2025-08-04 0:38 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-04 0:35 [PATCH AUTOSEL 6.1 01/51] usb: xhci: print xhci->xhc_state when queue_command failed Sasha Levin
2025-08-04 0:35 ` [PATCH AUTOSEL 6.1 02/51] cpufreq: CPPC: Mark driver with NEED_UPDATE_LIMITS flag Sasha Levin
2025-08-04 0:35 ` [PATCH AUTOSEL 6.1 03/51] selftests/futex: Define SYS_futex on 32-bit architectures with 64-bit time_t Sasha Levin
2025-08-04 0:35 ` [PATCH AUTOSEL 6.1 04/51] usb: typec: ucsi: psy: Set current max to 100mA for BC 1.2 and Default Sasha Levin
2025-08-04 0:35 ` [PATCH AUTOSEL 6.1 05/51] regulator: core: repeat voltage setting request for stepped regulators Sasha Levin
2025-08-04 0:35 ` [PATCH AUTOSEL 6.1 06/51] usb: xhci: Avoid showing warnings for dying controller Sasha Levin
2025-08-04 0:35 ` [PATCH AUTOSEL 6.1 07/51] usb: xhci: Set avg_trb_len = 8 for EP0 during Address Device Command Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 08/51] usb: xhci: Avoid showing errors during surprise removal Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 09/51] remoteproc: imx_rproc: skip clock enable when M-core is managed by the SCU Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 10/51] gpio: wcd934x: check the return value of regmap_update_bits() Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 11/51] cpufreq: Exit governor when failed to start old governor Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 12/51] ARM: rockchip: fix kernel hang during smp initialization Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 13/51] PM / devfreq: governor: Replace sscanf() with kstrtoul() in set_freq_store() Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 14/51] EDAC/synopsys: Clear the ECC counters on init Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 15/51] ASoC: soc-dapm: set bias_level if snd_soc_dapm_set_bias_level() was successed Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 16/51] thermal/drivers/qcom-spmi-temp-alarm: Enable stage 2 shutdown when required Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 17/51] tools/nolibc: define time_t in terms of __kernel_old_time_t Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 18/51] iio: adc: ad_sigma_delta: don't overallocate scan buffer Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 19/51] gpio: tps65912: check the return value of regmap_update_bits() Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 20/51] ARM: tegra: Use I/O memcpy to write to IRAM Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 21/51] tools/build: Fix s390(x) cross-compilation with clang Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 22/51] selftests: tracing: Use mutex_unlock for testing glob filter Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 23/51] ACPI: PRM: Reduce unnecessary printing to avoid user confusion Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 24/51] pwm: sifive: Fix PWM algorithm and clarify inverted compare behavior Sasha Levin
2025-08-04 10:38 ` Uwe Kleine-König
2025-08-16 13:08 ` Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 25/51] PM: runtime: Clear power.needs_force_resume in pm_runtime_reinit() Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 26/51] thermal: sysfs: Return ENODATA instead of EAGAIN for reads Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 27/51] PM: sleep: console: Fix the black screen issue Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 28/51] ACPI: processor: fix acpi_object initialization Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 29/51] mmc: sdhci-msm: Ensure SD card power isn't ON when card removed Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 30/51] ACPI: APEI: GHES: add TAINT_MACHINE_CHECK on GHES panic path Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 31/51] pps: clients: gpio: fix interrupt handling order in remove path Sasha Levin
2025-08-04 6:56 ` Rodolfo Giometti
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 32/51] reset: brcmstb: Enable reset drivers for ARCH_BCM2835 Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 33/51] mei: bus: Check for still connected devices in mei_cl_bus_dev_release() Sasha Levin
2025-08-04 0:36 ` Sasha Levin [this message]
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 35/51] ALSA: hda: Handle the jack polling always via a work Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 36/51] ALSA: hda: Disable jack polling at shutdown Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 37/51] x86/bugs: Avoid warning when overriding return thunk Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 38/51] ASoC: hdac_hdmi: Rate limit logging on connection and disconnection Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 39/51] ALSA: intel8x0: Fix incorrect codec index usage in mixer for ICH4 Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 40/51] ASoC: core: Check for rtd == NULL in snd_soc_remove_pcm_runtime() Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 41/51] usb: typec: intel_pmc_mux: Defer probe if SCU IPC isn't present Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 42/51] usb: core: usb_submit_urb: downgrade type check Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 43/51] usb: typec: fusb302: fix scheduling while atomic when using virtio-gpio Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 44/51] pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop() Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 45/51] platform/x86: thinkpad_acpi: Handle KCOV __init vs inline mismatches Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 46/51] platform/chrome: cros_ec_typec: Defer probe on missing EC parent Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 47/51] ALSA: hda/ca0132: Fix buffer overflow in add_tuning_control Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 48/51] ALSA: pcm: Rewrite recalculate_boundary() to avoid costly loop Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 49/51] ALSA: usb-audio: Avoid precedence issues in mixer_quirks macros Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 50/51] iio: adc: ad7768-1: Ensure SYNC_IN pulse minimum timing requirement Sasha Levin
2025-08-04 0:36 ` [PATCH AUTOSEL 6.1 51/51] ASoC: codecs: rt5640: Retry DEVICE_ID verification Sasha Levin
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=20250804003643.3625204-34-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=avri.altman@sandisk.com \
--cc=nathan@kernel.org \
--cc=patches@lists.linux.dev \
--cc=ricky_wu@realtek.com \
--cc=stable@vger.kernel.org \
--cc=u.kleine-koenig@baylibre.com \
--cc=ulf.hansson@linaro.org \
--cc=viro@zeniv.linux.org.uk \
--cc=wsa+renesas@sang-engineering.com \
--cc=zhoubinbin@loongson.cn \
/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