mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
UPSTREAM: scsi: ufs: Stop using the clock scaling lock in the error handler
Instead of locking and unlocking the clock scaling lock, surround the
command queueing code with an RCU reader lock and call synchronize_rcu().
This patch prepares for removal of the clock scaling lock.
Link: https://lore.kernel.org/r/20211203231950.193369-16-bvanassche@acm.org
Tested-by: Bean Huo <beanhuo@micron.com>
Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Bug: 234653003
(cherry picked from commit 5675c381ea)
Change-Id: Ic1f47d7bab37a74292c82ebb1d1204b3d7b003b7
Signed-off-by: Bart Van Assche <bvanassche@google.com>
This commit is contained in:
committed by
Bart Van Assche
parent
c07d3620e4
commit
82c80c5065
@@ -2745,6 +2745,12 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
||||
if (!down_read_trylock(&hba->clk_scaling_lock))
|
||||
return SCSI_MLQUEUE_HOST_BUSY;
|
||||
|
||||
/*
|
||||
* Allows the UFS error handler to wait for prior ufshcd_queuecommand()
|
||||
* calls.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
|
||||
switch (hba->ufshcd_state) {
|
||||
case UFSHCD_STATE_OPERATIONAL:
|
||||
break;
|
||||
@@ -2831,7 +2837,10 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
||||
}
|
||||
|
||||
ufshcd_send_command(hba, tag);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
||||
up_read(&hba->clk_scaling_lock);
|
||||
|
||||
if (ufs_trigger_eh()) {
|
||||
@@ -6038,8 +6047,7 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
|
||||
}
|
||||
ufshcd_scsi_block_requests(hba);
|
||||
/* Drain ufshcd_queuecommand() */
|
||||
down_write(&hba->clk_scaling_lock);
|
||||
up_write(&hba->clk_scaling_lock);
|
||||
synchronize_rcu();
|
||||
cancel_work_sync(&hba->eeh_work);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user