scsi: ufs: Avoid deadlock in suspend and eeh_work
In case of an exception, there could be a deadlock: eeh_work: -002|schedule() -003|spin_lock_irq() -003|rpm_resume << pm_runtime_get_sync(hba->dev); -004|__pm_runtime_resume() -005|ufshcd_scsi_block_requests() -005|ufshcd_exception_event_handler() ufshcd_suspend: -002|schedule() -003|schedule_timeout() -004|do_wait_for_common() -004|__wait_for_common() -004|wait_for_common() -005|wait_for_completion() -006|destroy_work_on_stack() -006|flush_work(?) << eeh_work -007|ufshcd_suspend() -008|ufshcd_runtime_suspend() -009|ufshcd_pltfrm_runtime_suspend() -010|pm_generic_runtime_suspend() -011|__rpm_callback() Scenario looks like : 1.Hba->eeh_work starts to work and at the almost same time ufshcd_runtime_suspend start to work by rpm core. 2.pm_runtime_get_sync in eeh_work remains pending as rpm_status is RPM_SUSPENDING due to ufshcd_runtime_suspend. To fix this, call pm_runtime_get_noresume() once eeh_work is scheduled so that suspend cannot be invoked during exception work. Change-Id: Ib212f71e22f063dad9c6ccca4aa8f7261e568b51 Signed-off-by: Asutosh Das <asutoshd@codeaurora.org> Signed-off-by: Sayali Lokhande <sayalil@codeaurora.org>
Loading
Please register or sign in to comment