scsi: hisi_sas: optimise the usage of DQ locking
authorXiang Chen <chenxiang66@hisilicon.com>
Wed, 2 May 2018 15:56:24 +0000 (23:56 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 8 May 2018 05:10:43 +0000 (01:10 -0400)
In the DQ tasklet processing it is not necessary to take the DQ lock, as
there is no contention between adding slots to the CQ and removing slots
from the matching DQ.

In addition, since we run each DQ in a separate tasklet context, there
would be no possible contention between DQ processing running for the
same queue in parallel.

It is still necessary to take hisi_hba lock when free'ing slots.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index a5abde855cb2575a0cebbfd1950ac06e9cbdb595..384e4ef50b24c709f523175cb69764d76ec992c4 100644 (file)
@@ -3151,14 +3151,12 @@ static void cq_tasklet_v2_hw(unsigned long val)
        struct hisi_sas_complete_v2_hdr *complete_queue;
        u32 rd_point = cq->rd_point, wr_point, dev_id;
        int queue = cq->id;
-       struct hisi_sas_dq *dq = &hisi_hba->dq[queue];
 
        if (unlikely(hisi_hba->reject_stp_links_msk))
                phys_try_accept_stp_links_v2_hw(hisi_hba);
 
        complete_queue = hisi_hba->complete_hdr[queue];
 
-       spin_lock(&dq->lock);
        wr_point = hisi_sas_read32(hisi_hba, COMPL_Q_0_WR_PTR +
                                   (0x14 * queue));
 
@@ -3208,7 +3206,6 @@ static void cq_tasklet_v2_hw(unsigned long val)
        /* update rd_point */
        cq->rd_point = rd_point;
        hisi_sas_write32(hisi_hba, COMPL_Q_0_RD_PTR + (0x14 * queue), rd_point);
-       spin_unlock(&dq->lock);
 }
 
 static irqreturn_t cq_interrupt_v2_hw(int irq_no, void *p)
index 33735a7082b6dfab094c6a734517f68f0a820ec2..afc1242abdcf99e788411f6b79b5db2f86e747c7 100644 (file)
@@ -1721,11 +1721,9 @@ static void cq_tasklet_v3_hw(unsigned long val)
        struct hisi_sas_complete_v3_hdr *complete_queue;
        u32 rd_point = cq->rd_point, wr_point;
        int queue = cq->id;
-       struct hisi_sas_dq *dq = &hisi_hba->dq[queue];
 
        complete_queue = hisi_hba->complete_hdr[queue];
 
-       spin_lock(&dq->lock);
        wr_point = hisi_sas_read32(hisi_hba, COMPL_Q_0_WR_PTR +
                                   (0x14 * queue));
 
@@ -1752,7 +1750,6 @@ static void cq_tasklet_v3_hw(unsigned long val)
        /* update rd_point */
        cq->rd_point = rd_point;
        hisi_sas_write32(hisi_hba, COMPL_Q_0_RD_PTR + (0x14 * queue), rd_point);
-       spin_unlock(&dq->lock);
 }
 
 static irqreturn_t cq_interrupt_v3_hw(int irq_no, void *p)