]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scsi: qla2xxx: Move {get|rel}_sp to base_qpair struct
authorQuinn Tran <quinn.tran@cavium.com>
Tue, 4 Sep 2018 21:19:15 +0000 (14:19 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 12 Sep 2018 00:28:08 +0000 (20:28 -0400)
Currently, qla2x00_[get_sp|rel_sp] routines does {get|release} of srb
resource/srb_mempool directly from qla_hw_data.  qla2x00_start_sp() is used to
issue management commands through the default Request Q 0 & Response Q 0 or
base_qpair. This patch moves access of these resources through
base_qpair. Instead of having knowledge of specific Q number and lock to
rsp/req queue, this change will key off the qpair that is assigned to the srb
resource. This lays the ground work for other routines to see this resource
through the qpair.

Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_inline.h
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/qla2xxx/qla_nvme.c
drivers/scsi/qla2xxx/qla_os.c

index 902106f970200e053ed6481ba76c3f78a020b5c4..385c46f2576efc530eb86b83e4aa534638673b5c 100644 (file)
@@ -4157,7 +4157,6 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res)
                if (rc) {
                        /* Cleanup here to prevent memory leak */
                        qla24xx_sp_unmap(vha, sp);
-                       sp->free(sp);
                }
 
                spin_lock_irqsave(&vha->work_lock, flags);
index fbbf530a38e0701b3bf02555669736ca4434548d..49c8f01196207dc1604a45b905b61bbd07609668 100644 (file)
@@ -1761,7 +1761,8 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
        srb_t *sp;
        int rval = QLA_FUNCTION_FAILED;
 
-       sp = qla2xxx_get_qpair_sp(cmd_sp->qpair, cmd_sp->fcport, GFP_KERNEL);
+       sp = qla2xxx_get_qpair_sp(cmd_sp->vha, cmd_sp->qpair, cmd_sp->fcport,
+           GFP_KERNEL);
        if (!sp)
                goto done;
 
index 4351736b2426da9848b9fd3a81d7fb9ed745c39f..bf9a6f01fd9f8a0bce2d7dd607b2412e89d8865c 100644 (file)
@@ -209,7 +209,8 @@ qla2x00_chip_is_down(scsi_qla_host_t *vha)
 }
 
 static inline srb_t *
-qla2xxx_get_qpair_sp(struct qla_qpair *qpair, fc_port_t *fcport, gfp_t flag)
+qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair,
+    fc_port_t *fcport, gfp_t flag)
 {
        srb_t *sp = NULL;
        uint8_t bail;
@@ -225,7 +226,9 @@ qla2xxx_get_qpair_sp(struct qla_qpair *qpair, fc_port_t *fcport, gfp_t flag)
        memset(sp, 0, sizeof(*sp));
        sp->fcport = fcport;
        sp->iocbs = 1;
-       sp->vha = qpair->vha;
+       sp->vha = vha;
+       sp->qpair = qpair;
+       sp->cmd_type = TYPE_SRB;
        INIT_LIST_HEAD(&sp->elem);
 
 done:
@@ -246,19 +249,17 @@ qla2x00_get_sp(scsi_qla_host_t *vha, fc_port_t *fcport, gfp_t flag)
 {
        srb_t *sp = NULL;
        uint8_t bail;
+       struct qla_qpair *qpair;
 
        QLA_VHA_MARK_BUSY(vha, bail);
        if (unlikely(bail))
                return NULL;
 
-       sp = mempool_alloc(vha->hw->srb_mempool, flag);
+       qpair = vha->hw->base_qpair;
+       sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, flag);
        if (!sp)
                goto done;
 
-       memset(sp, 0, sizeof(*sp));
-       sp->fcport = fcport;
-       sp->cmd_type = TYPE_SRB;
-       sp->iocbs = 1;
        sp->vha = vha;
 done:
        if (!sp)
@@ -270,7 +271,7 @@ static inline void
 qla2x00_rel_sp(srb_t *sp)
 {
        QLA_VHA_MARK_NOT_BUSY(sp->vha);
-       mempool_free(sp, sp->vha->hw->srb_mempool);
+       qla2xxx_rel_qpair_sp(sp->qpair, sp);
 }
 
 static inline void
index c699bbb8485bbc4398d054675fa1d091d84d6d9e..6335b8ce5fbdaa7cb982d497830665f59f71d4c9 100644 (file)
@@ -3440,12 +3440,13 @@ qla2x00_start_sp(srb_t *sp)
        int rval;
        scsi_qla_host_t *vha = sp->vha;
        struct qla_hw_data *ha = vha->hw;
+       struct qla_qpair *qp = sp->qpair;
        void *pkt;
        unsigned long flags;
 
        rval = QLA_FUNCTION_FAILED;
-       spin_lock_irqsave(&ha->hardware_lock, flags);
-       pkt = qla2x00_alloc_iocbs(vha, sp);
+       spin_lock_irqsave(qp->qp_lock_ptr, flags);
+       pkt = __qla2x00_alloc_iocbs(sp->qpair, sp);
        if (!pkt) {
                ql_log(ql_log_warn, vha, 0x700c,
                    "qla2x00_alloc_iocbs failed.\n");
@@ -3523,9 +3524,9 @@ qla2x00_start_sp(srb_t *sp)
        }
 
        wmb();
-       qla2x00_start_iocbs(vha, ha->req_q_map[0]);
+       qla2x00_start_iocbs(vha, qp->req);
 done:
-       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+       spin_unlock_irqrestore(qp->qp_lock_ptr, flags);
        return rval;
 }
 
index 20d9dc39f0fbe00762e83c0b056be68cd434312b..42dc846cc8dd44d336665de823793c02e53f3753 100644 (file)
@@ -506,7 +506,7 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,
                return -EBUSY;
 
        /* Alloc SRB structure */
-       sp = qla2xxx_get_qpair_sp(qpair, fcport, GFP_ATOMIC);
+       sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, GFP_ATOMIC);
        if (!sp)
                return -EBUSY;
 
index 6fa321a4229d0257f725d9643c44d76a96c1a260..210e5c2999f43b0302829e9f83ecdb8752cdfcea 100644 (file)
@@ -398,6 +398,7 @@ static void qla_init_base_qpair(struct scsi_qla_host *vha, struct req_que *req,
        ha->base_qpair->qp_lock_ptr = &ha->hardware_lock;
        ha->base_qpair->use_shadow_reg = IS_SHADOW_REG_CAPABLE(ha) ? 1 : 0;
        ha->base_qpair->msix = &ha->msix_entries[QLA_MSIX_RSP_Q];
+       ha->base_qpair->srb_mempool = ha->srb_mempool;
        INIT_LIST_HEAD(&ha->base_qpair->hints_list);
        ha->base_qpair->enable_class_2 = ql2xenableclass2;
        /* init qpair to this cpu. Will adjust at run time. */
@@ -1013,7 +1014,7 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd,
        else
                goto qc24_target_busy;
 
-       sp = qla2xxx_get_qpair_sp(qpair, fcport, GFP_ATOMIC);
+       sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, GFP_ATOMIC);
        if (!sp)
                goto qc24_host_busy;