FROMLIST: scsi: ufs: fix livelock on ufshcd_clear_ua_wlun
This fixes the below livelock which is caused by calling a scsi command before
ufshcd_scsi_unblock_requests() in ufshcd_ungate_work().
Workqueue: ufs_clk_gating_0 ufshcd_ungate_work
Call trace:
__switch_to+0x298/0x2bc
__schedule+0x59c/0x760
schedule+0xac/0xf0
schedule_timeout+0x44/0x1b4
io_schedule_timeout+0x44/0x68
wait_for_common_io+0x7c/0x100
wait_for_completion_io+0x14/0x20
blk_execute_rq+0x94/0xd0
__scsi_execute+0x100/0x1c0
ufshcd_clear_ua_wlun+0x124/0x1c8
ufshcd_host_reset_and_restore+0x1d0/0x2cc
ufshcd_link_recovery+0xac/0x134
ufshcd_uic_hibern8_exit+0x1e8/0x1f0
ufshcd_ungate_work+0xac/0x130
process_one_work+0x270/0x47c
worker_thread+0x27c/0x4d8
kthread+0x13c/0x320
ret_from_fork+0x10/0x18
Bug: 175231713
Bug: 175391270
Bug: 171886785
Link: https://lore.kernel.org/linux-scsi/20201216190225.2769012-1-jaegeuk@kernel.org/T/#u
Fixes: f2da571038 ("FROMLIST: scsi: ufs: clear uac for RPMB after ufshcd resets")
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
Change-Id: Ic88d9746b9881e98d7a870b8a80fc37daefeee28
This commit is contained in:
@@ -1585,6 +1585,7 @@ static void ufshcd_ungate_work(struct work_struct *work)
|
||||
}
|
||||
unblock_reqs:
|
||||
ufshcd_scsi_unblock_requests(hba);
|
||||
ufshcd_clear_ua_wluns(hba);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -6911,7 +6912,7 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba)
|
||||
|
||||
/* Establish the link again and restore the device */
|
||||
err = ufshcd_probe_hba(hba, false);
|
||||
if (!err)
|
||||
if (!err && !hba->clk_gating.is_suspended)
|
||||
ufshcd_clear_ua_wluns(hba);
|
||||
out:
|
||||
if (err)
|
||||
@@ -8734,6 +8735,7 @@ enable_gating:
|
||||
ufshcd_resume_clkscaling(hba);
|
||||
hba->clk_gating.is_suspended = false;
|
||||
hba->dev_info.b_rpm_dev_flush_capable = false;
|
||||
ufshcd_clear_ua_wluns(hba);
|
||||
ufshcd_release(hba);
|
||||
out:
|
||||
if (hba->dev_info.b_rpm_dev_flush_capable) {
|
||||
@@ -8839,6 +8841,8 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
cancel_delayed_work(&hba->rpm_dev_flush_recheck_work);
|
||||
}
|
||||
|
||||
ufshcd_clear_ua_wluns(hba);
|
||||
|
||||
/* Schedule clock gating in case of no access to UFS device yet */
|
||||
ufshcd_release(hba);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user