From: sashiko-bot@kernel.org
To: "HOYOUNG SEO" <hy50.seo@samsung.com>, linux-scsi@vger.kernel.org
Subject: Re: [PATCH v5 2/2] scsi: ufs: core: Do not recover the link early in the error handler during system PM
Date: Thu, 05 Nov 2026 08:14:56 +0000 [thread overview]
Message-ID: <sashiko-outbox-198714@kernel.org> (raw)
In-Reply-To: <acafa54491e27cab79150be04bd7dc91b6b352ad.1793865172.git.hy50.seo@samsung.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] scsi: ufs: core: race on system_pm_in_progress in ufshcd_err_handler()
--
commit 991f616e0ee805a5ba3aa9d0edc90a319abd06b6
Author: HOYOUNG SEO <hy50.seo@samsung.com>
scsi: ufs: core: Do not recover the link early in the error handler during system PM
This commit adds hba->system_pm_in_progress so that ufshcd_err_handler()
skips its early unlocked ufshcd_link_recovery() path during system suspend
and system resume, waiting on hba->host_sem instead.
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 3b5580ac390cb..761ffc8f0a32a 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -7091,9 +7091,13 @@ static void ufshcd_err_handler(struct work_struct *work)
> * runtime resume. This avoids potential deadlocks that could
> * happen if we tried to resume the device while a PM operation
> * is already in progress.
> + *
> + * Do not do this for system PM. The system PM callbacks hold
> + * host_sem, so the regular path below runs after them instead
> + * of resetting the link concurrently.
> */
> ufshcd_rpm_get_noresume(hba);
> - if (hba->pm_op_in_progress) {
> + if (hba->pm_op_in_progress && !hba->system_pm_in_progress) {
> ufshcd_link_recovery(hba);
> ufshcd_rpm_put(hba);
> return;
> @@ -10393,6 +10397,7 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
> enum uic_link_state req_link_state;
>
> hba->pm_op_in_progress = true;
> + hba->system_pm_in_progress = (pm_op == UFS_SYSTEM_PM);
> if (pm_op != UFS_SHUTDOWN_PM) {
> pm_lvl = pm_op == UFS_RUNTIME_PM ?
> hba->rpm_lvl : hba->spm_lvl;
> @@ -10565,6 +10570,7 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
> hba->clk_gating.is_suspended = false;
> ufshcd_release(hba);
> }
> + hba->system_pm_in_progress = false;
> hba->pm_op_in_progress = false;
> return ret;
> }
> @@ -10576,6 +10582,7 @@ static int __ufshcd_wl_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
> enum uic_link_state old_link_state = hba->uic_link_state;
>
> hba->pm_op_in_progress = true;
> + hba->system_pm_in_progress = (pm_op == UFS_SYSTEM_PM);
>
> /*
> * Call vendor specific resume callback. As these callbacks may access
> @@ -10666,6 +10673,7 @@ static int __ufshcd_wl_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
> ufshcd_update_evt_hist(hba, UFS_EVT_WL_RES_ERR, (u32)ret);
> hba->clk_gating.is_suspended = false;
> ufshcd_release(hba);
> + hba->system_pm_in_progress = false;
> hba->pm_op_in_progress = false;
> return ret;
> }
[Severity: Medium]
Can ufshcd_err_handler() still observe hba->pm_op_in_progress == true and
hba->system_pm_in_progress == false during system suspend or system resume?
ufshcd_err_handler() reads both flags without holding hba->host_sem or any
other lock shared with __ufshcd_wl_suspend() and __ufshcd_wl_resume().
At the entry of __ufshcd_wl_suspend() and __ufshcd_wl_resume(),
hba->pm_op_in_progress = true is written before hba->system_pm_in_progress is
set, and at exit hba->system_pm_in_progress = false is cleared before
hba->pm_op_in_progress = false, without barriers or READ_ONCE()/WRITE_ONCE().
In particular, when __ufshcd_wl_suspend() encounters an error during
UFS_SYSTEM_PM, it calls ufshcd_force_error_recovery() (which immediately
queues hba->eh_work) and jumps to out:
drivers/ufs/core/ufshcd.c:__ufshcd_wl_suspend() {
...
if (ret && pm_op != UFS_SHUTDOWN_PM) {
ufshcd_force_error_recovery(hba);
ret = -EBUSY;
}
...
out:
...
if (ret) {
ufshcd_update_evt_hist(hba, UFS_EVT_WL_SUSP_ERR, (u32)ret);
hba->clk_gating.is_suspended = false;
ufshcd_release(hba);
}
hba->system_pm_in_progress = false;
hba->pm_op_in_progress = false;
return ret;
}
If ufshcd_err_handler() evaluates the condition in the entry or exit window
(or due to compiler/CPU reordering), it will enter the early
ufshcd_link_recovery() path without hba->host_sem or a clock-gating hold and
return early without running the regular error handling path (such as
ufshcd_err_handling_prepare() and ufshcd_recover_pm_error()).
Would ordering the updates (or encoding the active PM operation in a single
variable accessed with READ_ONCE()/WRITE_ONCE()) avoid this race window?
--
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1793865172.git.hy50.seo@samsung.com?part=2
prev parent reply other threads:[~2026-11-05 8:14 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20261105080058epcas2p33d17a4cc3163920fd24a3c378f21e3ae@epcas2p3.samsung.com>
2026-11-05 7:56 ` [PATCH v5 0/2] scsi: ufs: core: Avoid redundant link recovery from the error handler during system PM HOYOUNG SEO
2026-11-05 7:56 ` [PATCH v5 1/2] scsi: ufs: core: Clear saved errors in ufshcd_link_recovery HOYOUNG SEO
2026-11-05 7:56 ` [PATCH v5 2/2] scsi: ufs: core: Do not recover the link early in the error handler during system PM HOYOUNG SEO
2026-11-05 8:14 ` sashiko-bot [this message]
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=sashiko-outbox-198714@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=hy50.seo@samsung.com \
--cc=linux-scsi@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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.