Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80d4ffbb authored by Bao D. Nguyen's avatar Bao D. Nguyen Committed by Subhash Jadavani
Browse files

scsi: ufs: Avoid dead lock during error recovery



The UFS error handler work may be entered from the clock scaling context
which may have acquired the lock used to synchronize between clock scaling
and shutdown. Part of the error handler work is to send management
requests during which the same synchronization lock is acquired again.
This condition leads to a dead lock. To avoid this dead lock,
skip acquiring the synchronization lock when sending management
requests as part of the error handler.

Change-Id: I38179528868aaeb4a788a83ca8f9c458afea862a
Signed-off-by: default avatarBao D. Nguyen <nguyenb@codeaurora.org>
parent a3ba7da6
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -3342,8 +3342,10 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
	/*
	 * May get invoked from shutdown and IOCTL contexts.
	 * In shutdown context, it comes in with lock acquired.
	 * In error recovery context, it may come with lock acquired.
	 */
	if (!ufshcd_is_shutdown_ongoing(hba))

	if (!ufshcd_is_shutdown_ongoing(hba) && !ufshcd_eh_in_progress(hba))
		down_read(&hba->lock);

	/*
@@ -3377,7 +3379,7 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
out_put_tag:
	ufshcd_put_dev_cmd_tag(hba, tag);
	wake_up(&hba->dev_cmd.tag_wq);
	if (!ufshcd_is_shutdown_ongoing(hba))
	if (!ufshcd_is_shutdown_ongoing(hba) && !ufshcd_eh_in_progress(hba))
		up_read(&hba->lock);
	return err;
}