Skip to content

Commit e3b9278

Browse files
quic-ziqichenSasha Levin
authored andcommitted
scsi: ufs: core: Don't perform UFS clkscaling during host async scan
[ Upstream commit e976334 ] When preparing for UFS clock scaling, the UFS driver will quiesce all sdevs queues in the UFS SCSI host tagset list and then unquiesce them in ufshcd_clock_scaling_unprepare(). If the UFS SCSI host async scan is in progress at this time, some LUs may be added to the tagset list between UFS clkscale prepare and unprepare. This can cause two issues: 1. During clock scaling, there may be I/O requests issued through new added queues that have not been quiesced, leading to task abort issue. 2. These new added queues that have not been quiesced will be unquiesced as well when UFS clkscale is unprepared, resulting in warning prints. Therefore, use the mutex lock scan_mutex in ufshcd_clock_scaling_prepare() and ufshcd_clock_scaling_unprepare() to protect it. Co-developed-by: Can Guo <quic_cang@quicinc.com> Signed-off-by: Can Guo <quic_cang@quicinc.com> Signed-off-by: Ziqi Chen <quic_ziqichen@quicinc.com> Link: https://lore.kernel.org/r/20250522081233.2358565-1-quic_ziqichen@quicinc.com Suggested-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent aacda2f commit e3b9278

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

drivers/ufs/core/ufshcd.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,6 +1392,7 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us)
13921392
* make sure that there are no outstanding requests when
13931393
* clock scaling is in progress
13941394
*/
1395+
mutex_lock(&hba->host->scan_mutex);
13951396
blk_mq_quiesce_tagset(&hba->host->tag_set);
13961397
mutex_lock(&hba->wb_mutex);
13971398
down_write(&hba->clk_scaling_lock);
@@ -1402,6 +1403,7 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us)
14021403
up_write(&hba->clk_scaling_lock);
14031404
mutex_unlock(&hba->wb_mutex);
14041405
blk_mq_unquiesce_tagset(&hba->host->tag_set);
1406+
mutex_unlock(&hba->host->scan_mutex);
14051407
goto out;
14061408
}
14071409

@@ -1423,6 +1425,7 @@ static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err, bool sc
14231425
mutex_unlock(&hba->wb_mutex);
14241426

14251427
blk_mq_unquiesce_tagset(&hba->host->tag_set);
1428+
mutex_unlock(&hba->host->scan_mutex);
14261429
ufshcd_release(hba);
14271430
}
14281431

0 commit comments

Comments
 (0)