Skip to content

Commit d2875b8

Browse files
bvanasschemartinkpetersen
authored andcommitted
scsi: ufs: core: Fix a deadlock in the frequency scaling code
Commit 08b12cd ("scsi: ufs: core: Switch to scsi_get_internal_cmd()") accidentally introduced a deadlock in the frequency scaling code. ufshcd_clock_scaling_unprepare() may submit a device management command while SCSI command processing is blocked. The deadlock was introduced by using the SCSI core for submitting device management commands (scsi_get_internal_cmd() + blk_execute_rq()). Fix this deadlock by calling blk_mq_unquiesce_tagset() before any device management commands are submitted by ufshcd_clock_scaling_unprepare(). Fixes: 08b12cd ("scsi: ufs: core: Switch to scsi_get_internal_cmd()") Reported-by: Manivannan Sadhasivam <mani@kernel.org> Reported-by: Roger Shimizu <rosh@debian.org> Closes: https://lore.kernel.org/linux-scsi/ehorjaflathzab5oekx2nae2zss5vi2r36yqkqsfjb2fgsifz2@yk3us5g3igow/ Tested-by: Roger Shimizu <rosh@debian.org> Cc: Nitin Rawat <nitin.rawat@oss.qualcomm.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Peter Wang <peter.wang@mediatek.com> Reviewed-by: Nitin Rawat <nitin.rawat@oss.qualcomm.com> Tested-by: Alexey Klimov <alexey.klimov@linaro.org> # RB5 board Link: https://patch.msgid.link/20251204181548.1006696-1-bvanassche@acm.org Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 14be351 commit d2875b8

1 file changed

Lines changed: 3 additions & 4 deletions

File tree

drivers/ufs/core/ufshcd.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,15 +1455,14 @@ static int ufshcd_clock_scaling_prepare(struct ufs_hba *hba, u64 timeout_us)
14551455
static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err)
14561456
{
14571457
up_write(&hba->clk_scaling_lock);
1458+
mutex_unlock(&hba->wb_mutex);
1459+
blk_mq_unquiesce_tagset(&hba->host->tag_set);
1460+
mutex_unlock(&hba->host->scan_mutex);
14581461

14591462
/* Enable Write Booster if current gear requires it else disable it */
14601463
if (ufshcd_enable_wb_if_scaling_up(hba) && !err)
14611464
ufshcd_wb_toggle(hba, hba->pwr_info.gear_rx >= hba->clk_scaling.wb_gear);
14621465

1463-
mutex_unlock(&hba->wb_mutex);
1464-
1465-
blk_mq_unquiesce_tagset(&hba->host->tag_set);
1466-
mutex_unlock(&hba->host->scan_mutex);
14671466
ufshcd_release(hba);
14681467
}
14691468

0 commit comments

Comments
 (0)