OSDN Git Service

scsi: ufs: Stop using the clock scaling lock in the error handler
authorBart Van Assche <bvanassche@acm.org>
Fri, 3 Dec 2021 23:19:48 +0000 (15:19 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 7 Dec 2021 03:30:34 +0000 (22:30 -0500)
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>
drivers/scsi/ufs/ufshcd.c

index d434d76..9f0a1f6 100644 (file)
@@ -2684,6 +2684,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;
@@ -2762,7 +2768,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()) {
@@ -5951,8 +5960,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);
 }