From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Stanley Chu <stanley.chu@mediatek.com>,
Avri Altman <avri.altman@wdc.com>,
Andy Teng <andy.teng@mediatek.com>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Sasha Levin <sashal@kernel.org>,
linux-scsi@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org
Subject: [PATCH AUTOSEL 4.19 13/21] scsi: ufs: Fix possible infinite loop in ufshcd_hold
Date: Mon, 24 Aug 2020 12:38:37 -0400 [thread overview]
Message-ID: <20200824163845.606933-13-sashal@kernel.org> (raw)
In-Reply-To: <20200824163845.606933-1-sashal@kernel.org>
From: Stanley Chu <stanley.chu@mediatek.com>
[ Upstream commit 93b6c5db06028a3b55122bbb74d0715dd8ca4ae0 ]
In ufshcd_suspend(), after clk-gating is suspended and link is set
as Hibern8 state, ufshcd_hold() is still possibly invoked before
ufshcd_suspend() returns. For example, MediaTek's suspend vops may
issue UIC commands which would call ufshcd_hold() during the command
issuing flow.
Now if UFSHCD_CAP_HIBERN8_WITH_CLK_GATING capability is enabled,
then ufshcd_hold() may enter infinite loops because there is no
clk-ungating work scheduled or pending. In this case, ufshcd_hold()
shall just bypass, and keep the link as Hibern8 state.
Link: https://lore.kernel.org/r/20200809050734.18740-1-stanley.chu@mediatek.com
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Co-developed-by: Andy Teng <andy.teng@mediatek.com>
Signed-off-by: Andy Teng <andy.teng@mediatek.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/scsi/ufs/ufshcd.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index bd21c9cdf8183..ff6912f9f49f7 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1538,6 +1538,7 @@ static void ufshcd_ungate_work(struct work_struct *work)
int ufshcd_hold(struct ufs_hba *hba, bool async)
{
int rc = 0;
+ bool flush_result;
unsigned long flags;
if (!ufshcd_is_clkgating_allowed(hba))
@@ -1569,7 +1570,9 @@ int ufshcd_hold(struct ufs_hba *hba, bool async)
break;
}
spin_unlock_irqrestore(hba->host->host_lock, flags);
- flush_work(&hba->clk_gating.ungate_work);
+ flush_result = flush_work(&hba->clk_gating.ungate_work);
+ if (hba->clk_gating.is_suspended && !flush_result)
+ goto out;
spin_lock_irqsave(hba->host->host_lock, flags);
goto start;
}
--
2.25.1
next prev parent reply other threads:[~2020-08-24 16:56 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-24 16:38 [PATCH AUTOSEL 4.19 01/21] jbd2: make sure jh have b_transaction set in refile/unfile_buffer Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 02/21] ext4: don't BUG on inconsistent journal feature Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 03/21] ext4: handle read only external journal device Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 04/21] jbd2: abort journal if free a async write error metadata buffer Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 05/21] ext4: handle option set by mount flags correctly Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 06/21] ext4: handle error of ext4_setup_system_zone() on remount Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 07/21] ext4: correctly restore system zone info when remount fails Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 08/21] fs: prevent BUG_ON in submit_bh_wbc() Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 09/21] spi: stm32: fix stm32_spi_prepare_mbr in case of odd clk_rate Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 10/21] s390/cio: add cond_resched() in the slow_eval_known_fn() loop Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 11/21] ASoC: wm8994: Avoid attempts to read unreadable registers Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 12/21] scsi: fcoe: Fix I/O path allocation Sasha Levin
2020-08-24 16:38 ` Sasha Levin [this message]
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 14/21] scsi: ufs: Improve interrupt handling for shared interrupts Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 15/21] scsi: ufs: Clean up completed request without interrupt notification Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 16/21] scsi: qla2xxx: Check if FW supports MQ before enabling Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 17/21] scsi: qla2xxx: Fix null pointer access during disconnect from subsystem Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 18/21] Revert "scsi: qla2xxx: Fix crash on qla2x00_mailbox_command" Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 19/21] macvlan: validate setting of multiple remote source MAC addresses Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 20/21] net: gianfar: Add of_node_put() before goto statement Sasha Levin
2020-08-24 16:38 ` [PATCH AUTOSEL 4.19 21/21] powerpc/perf: Fix soft lockups due to missed interrupt accounting 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=20200824163845.606933-13-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=andy.teng@mediatek.com \
--cc=avri.altman@wdc.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=stable@vger.kernel.org \
--cc=stanley.chu@mediatek.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox