Skip to content

Commit e976334

Browse files
quic-ziqichenmartinkpetersen
authored andcommitted
scsi: ufs: core: Don't perform UFS clkscaling during host async scan
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 <[email protected]> Signed-off-by: Can Guo <[email protected]> Signed-off-by: Ziqi Chen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Suggested-by: Bart Van Assche <[email protected]> Reviewed-by: Bart Van Assche <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent fd2963e commit e976334

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
@@ -1397,6 +1397,7 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us)
13971397
* make sure that there are no outstanding requests when
13981398
* clock scaling is in progress
13991399
*/
1400+
mutex_lock(&hba->host->scan_mutex);
14001401
blk_mq_quiesce_tagset(&hba->host->tag_set);
14011402
mutex_lock(&hba->wb_mutex);
14021403
down_write(&hba->clk_scaling_lock);
@@ -1407,6 +1408,7 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us)
14071408
up_write(&hba->clk_scaling_lock);
14081409
mutex_unlock(&hba->wb_mutex);
14091410
blk_mq_unquiesce_tagset(&hba->host->tag_set);
1411+
mutex_unlock(&hba->host->scan_mutex);
14101412
goto out;
14111413
}
14121414

@@ -1428,6 +1430,7 @@ static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err)
14281430
mutex_unlock(&hba->wb_mutex);
14291431

14301432
blk_mq_unquiesce_tagset(&hba->host->tag_set);
1433+
mutex_unlock(&hba->host->scan_mutex);
14311434
ufshcd_release(hba);
14321435
}
14331436

0 commit comments

Comments
 (0)