mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 00:24:12 +08:00
scsi: qla2xxx: Move {get|rel}_sp to base_qpair struct
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>
This commit is contained in:
parent
8b4673ba3a
commit
6a62946892
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user