Code refactor:
In the IO submission path _base_get_msix_index is called twice,
one while getting the smid; msix index is saved in msix_io filed
in scsiio tracker and anther while posting the request descriptor(RD).

now code refactor is done to determine msix index only while posting
the request descriptor and save determined msix index in msix_io
field.

Signed-off-by: Suganath Prabu S <suganath-prabu.subram...@broadcom.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c  | 42 ++++++++++++++++++++++------
 drivers/scsi/mpt3sas/mpt3sas_base.h  |  1 +
 drivers/scsi/mpt3sas/mpt3sas_scsih.c |  1 +
 3 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 74cb060..8779d2b 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -3399,8 +3399,8 @@ mpt3sas_base_get_smid_scsiio(struct MPT3SAS_ADAPTER *ioc, 
u8 cb_idx,
 
        smid = tag + 1;
        request->cb_idx = cb_idx;
-       request->msix_io = _base_get_msix_index(ioc, NULL);
        request->smid = smid;
+       request->scmd = scmd;
        INIT_LIST_HEAD(&request->chain_list);
        return smid;
 }
@@ -3454,6 +3454,7 @@ void mpt3sas_base_clear_st(struct MPT3SAS_ADAPTER *ioc,
                return;
        st->cb_idx = 0xFF;
        st->direct_io = 0;
+       st->scmd = NULL;
        atomic_set(&ioc->chain_lookup[st->smid - 1].chain_offset, 0);
        st->smid = 0;
 }
@@ -3552,6 +3553,29 @@ _base_writeq(__u64 b, volatile void __iomem *addr, 
spinlock_t *writeq_lock)
 }
 #endif
 
+/**
+ * _base_set_and_get_msix_index - get the msix index and assign to msix_io
+ *                                variable of scsi tracker
+ * @ioc: per adapter object
+ * @smid: system request message index
+ *
+ * returns msix index.
+ */
+static u8
+_base_set_and_get_msix_index(struct MPT3SAS_ADAPTER *ioc, u16 smid)
+{
+       struct scsiio_tracker *st = NULL;
+
+       if (smid < ioc->hi_priority_smid)
+               st = _get_st_from_smid(ioc, smid);
+
+       if (st == NULL)
+               return  _base_get_msix_index(ioc, NULL);
+
+       st->msix_io = ioc->get_msix_index_for_smlio(ioc, st->scmd);
+       return st->msix_io;
+}
+
 /**
  * _base_put_smid_mpi_ep_scsi_io - send SCSI_IO request to firmware
  * @ioc: per adapter object
@@ -3573,7 +3597,7 @@ _base_put_smid_mpi_ep_scsi_io(struct MPT3SAS_ADAPTER *ioc,
        _base_clone_mpi_to_sys_mem(mpi_req_iomem, (void *)mfp,
                                        ioc->request_sz);
        descriptor.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
-       descriptor.SCSIIO.MSIxIndex =  _base_get_msix_index(ioc, NULL);
+       descriptor.SCSIIO.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.SCSIIO.SMID = cpu_to_le16(smid);
        descriptor.SCSIIO.DevHandle = cpu_to_le16(handle);
        descriptor.SCSIIO.LMID = 0;
@@ -3595,7 +3619,7 @@ _base_put_smid_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 
smid, u16 handle)
 
 
        descriptor.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
-       descriptor.SCSIIO.MSIxIndex =  _base_get_msix_index(ioc, NULL);
+       descriptor.SCSIIO.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.SCSIIO.SMID = cpu_to_le16(smid);
        descriptor.SCSIIO.DevHandle = cpu_to_le16(handle);
        descriptor.SCSIIO.LMID = 0;
@@ -3618,7 +3642,7 @@ _base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 
smid,
 
        descriptor.SCSIIO.RequestFlags =
            MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO;
-       descriptor.SCSIIO.MSIxIndex = _base_get_msix_index(ioc, NULL);
+       descriptor.SCSIIO.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.SCSIIO.SMID = cpu_to_le16(smid);
        descriptor.SCSIIO.DevHandle = cpu_to_le16(handle);
        descriptor.SCSIIO.LMID = 0;
@@ -3682,7 +3706,7 @@ mpt3sas_base_put_smid_nvme_encap(struct MPT3SAS_ADAPTER 
*ioc, u16 smid)
 
        descriptor.Default.RequestFlags =
                MPI26_REQ_DESCRIPT_FLAGS_PCIE_ENCAPSULATED;
-       descriptor.Default.MSIxIndex =  _base_get_msix_index(ioc, NULL);
+       descriptor.Default.MSIxIndex =  _base_set_and_get_msix_index(ioc, smid);
        descriptor.Default.SMID = cpu_to_le16(smid);
        descriptor.Default.LMID = 0;
        descriptor.Default.DescriptorTypeDependent = 0;
@@ -3714,7 +3738,7 @@ _base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 
smid)
        }
        request = (u64 *)&descriptor;
        descriptor.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
-       descriptor.Default.MSIxIndex =  _base_get_msix_index(ioc, NULL);
+       descriptor.Default.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.Default.SMID = cpu_to_le16(smid);
        descriptor.Default.LMID = 0;
        descriptor.Default.DescriptorTypeDependent = 0;
@@ -3744,7 +3768,7 @@ _base_put_smid_scsi_io_atomic(struct MPT3SAS_ADAPTER 
*ioc, u16 smid,
        u32 *request = (u32 *)&descriptor;
 
        descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
-       descriptor.MSIxIndex = _base_get_msix_index(ioc, NULL);
+       descriptor.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.SMID = cpu_to_le16(smid);
 
        writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
@@ -3766,7 +3790,7 @@ _base_put_smid_fast_path_atomic(struct MPT3SAS_ADAPTER 
*ioc, u16 smid,
        u32 *request = (u32 *)&descriptor;
 
        descriptor.RequestFlags = MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO;
-       descriptor.MSIxIndex = _base_get_msix_index(ioc, NULL);
+       descriptor.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.SMID = cpu_to_le16(smid);
 
        writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
@@ -3810,7 +3834,7 @@ _base_put_smid_default_atomic(struct MPT3SAS_ADAPTER 
*ioc, u16 smid)
        u32 *request = (u32 *)&descriptor;
 
        descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
-       descriptor.MSIxIndex = _base_get_msix_index(ioc, NULL);
+       descriptor.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
        descriptor.SMID = cpu_to_le16(smid);
 
        writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h 
b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 85db1f2..f3818e3 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -830,6 +830,7 @@ struct chain_lookup {
  */
 struct scsiio_tracker {
        u16     smid;
+       struct scsi_cmnd *scmd;
        u8      cb_idx;
        u8      direct_io;
        struct pcie_sg_list pcie_sg_list;
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 1008c5e..3e93c4a 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -5210,6 +5210,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 
msix_index, u32 reply)
             ((ioc_status & MPI2_IOCSTATUS_MASK)
              != MPI2_IOCSTATUS_SCSI_TASK_TERMINATED)) {
                st->direct_io = 0;
+               st->scmd = scmd;
                memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
                mpi_request->DevHandle =
                    cpu_to_le16(sas_device_priv_data->sas_target->handle);
-- 
2.18.1

Reply via email to