Skip to content

Commit 8a3514d

Browse files
Sanjeev Yadavmartinkpetersen
authored andcommitted
scsi: core: ufs: Fix a hang in the error handler
ufshcd_err_handling_prepare() calls ufshcd_rpm_get_sync(). The latter function can only succeed if UFSHCD_EH_IN_PROGRESS is not set because resuming involves submitting a SCSI command and ufshcd_queuecommand() returns SCSI_MLQUEUE_HOST_BUSY if UFSHCD_EH_IN_PROGRESS is set. Fix this hang by setting UFSHCD_EH_IN_PROGRESS after ufshcd_rpm_get_sync() has been called instead of before. Backtrace: __switch_to+0x174/0x338 __schedule+0x600/0x9e4 schedule+0x7c/0xe8 schedule_timeout+0xa4/0x1c8 io_schedule_timeout+0x48/0x70 wait_for_common_io+0xa8/0x160 //waiting on START_STOP wait_for_completion_io_timeout+0x10/0x20 blk_execute_rq+0xe4/0x1e4 scsi_execute_cmd+0x108/0x244 ufshcd_set_dev_pwr_mode+0xe8/0x250 __ufshcd_wl_resume+0x94/0x354 ufshcd_wl_runtime_resume+0x3c/0x174 scsi_runtime_resume+0x64/0xa4 rpm_resume+0x15c/0xa1c __pm_runtime_resume+0x4c/0x90 // Runtime resume ongoing ufshcd_err_handler+0x1a0/0xd08 process_one_work+0x174/0x808 worker_thread+0x15c/0x490 kthread+0xf4/0x1ec ret_from_fork+0x10/0x20 Signed-off-by: Sanjeev Yadav <[email protected]> [ bvanassche: rewrote patch description ] Fixes: 6269473 ("[SCSI] ufs: Add runtime PM support for UFS host controller driver") Signed-off-by: Bart Van Assche <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Peter Wang <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 7831003 commit 8a3514d

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/ufs/core/ufshcd.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6623,9 +6623,14 @@ static void ufshcd_err_handler(struct work_struct *work)
66236623
up(&hba->host_sem);
66246624
return;
66256625
}
6626-
ufshcd_set_eh_in_progress(hba);
66276626
spin_unlock_irqrestore(hba->host->host_lock, flags);
6627+
66286628
ufshcd_err_handling_prepare(hba);
6629+
6630+
spin_lock_irqsave(hba->host->host_lock, flags);
6631+
ufshcd_set_eh_in_progress(hba);
6632+
spin_unlock_irqrestore(hba->host->host_lock, flags);
6633+
66296634
/* Complete requests that have door-bell cleared by h/w */
66306635
ufshcd_complete_requests(hba, false);
66316636
spin_lock_irqsave(hba->host->host_lock, flags);

0 commit comments

Comments
 (0)