scsi: ufs: core: Remove redundant host_lock calls around UTMRLDBR
authorAvri Altman <avri.altman@wdc.com>
Thu, 24 Oct 2024 07:50:31 +0000 (10:50 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Oct 2024 19:03:15 +0000 (15:03 -0400)
There is no need to serialize single read/write calls to the host
controller registers. Remove the redundant host_lock calls that protect
access to the task management doorbell register: UTMRLDBR.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
Link: https://lore.kernel.org/r/20241024075033.562562-2-avri.altman@wdc.com
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index c156c47..5827575 100644 (file)
@@ -1233,11 +1233,13 @@ static bool ufshcd_is_devfreq_scaling_required(struct ufs_hba *hba,
 static u32 ufshcd_pending_cmds(struct ufs_hba *hba)
 {
        const struct scsi_device *sdev;
+       unsigned long flags;
        u32 pending = 0;
 
-       lockdep_assert_held(hba->host->host_lock);
+       spin_lock_irqsave(hba->host->host_lock, flags);
        __shost_for_each_device(sdev, hba->host)
                pending += sbitmap_weight(&sdev->budget_map);
+       spin_unlock_irqrestore(hba->host->host_lock, flags);
 
        return pending;
 }
@@ -1251,7 +1253,6 @@ static u32 ufshcd_pending_cmds(struct ufs_hba *hba)
 static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba,
                                        u64 wait_timeout_us)
 {
-       unsigned long flags;
        int ret = 0;
        u32 tm_doorbell;
        u32 tr_pending;
@@ -1259,7 +1260,6 @@ static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba,
        ktime_t start;
 
        ufshcd_hold(hba);
-       spin_lock_irqsave(hba->host->host_lock, flags);
        /*
         * Wait for all the outstanding tasks/transfer requests.
         * Verify by checking the doorbell registers are clear.
@@ -1280,7 +1280,6 @@ static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba,
                        break;
                }
 
-               spin_unlock_irqrestore(hba->host->host_lock, flags);
                io_schedule_timeout(msecs_to_jiffies(20));
                if (ktime_to_us(ktime_sub(ktime_get(), start)) >
                    wait_timeout_us) {
@@ -1292,7 +1291,6 @@ static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba,
                         */
                        do_last_check = true;
                }
-               spin_lock_irqsave(hba->host->host_lock, flags);
        } while (tm_doorbell || tr_pending);
 
        if (timeout) {
@@ -1302,7 +1300,6 @@ static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba,
                ret = -EBUSY;
        }
 out:
-       spin_unlock_irqrestore(hba->host->host_lock, flags);
        ufshcd_release(hba);
        return ret;
 }
@@ -7048,12 +7045,13 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
        memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq));
        ufshcd_vops_setup_task_mgmt(hba, task_tag, tm_function);
 
-       /* send command to the controller */
        __set_bit(task_tag, &hba->outstanding_tasks);
-       ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
 
        spin_unlock_irqrestore(host->host_lock, flags);
 
+       /* send command to the controller */
+       ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
+
        ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_SEND);
 
        /* wait until the task management command is completed */