Re: [PATCH v2 1/7] qla2xxx: Multi-que support for TMF

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Apr 28, 2023, at 12:53 AM, Nilesh Javali <njavali@xxxxxxxxxxx> wrote:
> 
> From: Quinn Tran <qutran@xxxxxxxxxxx>
> 
> Add queue flush for task management command, before
> placing it on the wire.
> Do IO flush for all Request Q's.
> 
> Reported-by: kernel test robot <lkp@xxxxxxxxx>
> Link: https://lore.kernel.org/oe-kbuild-all/202304271702.GpIL391S-lkp@xxxxxxxxx/
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Quinn Tran <qutran@xxxxxxxxxxx>
> Signed-off-by: Nilesh Javali <njavali@xxxxxxxxxxx>
> ---
> v2:
> - Fix warning reported by kernel robot.
> 
> drivers/scsi/qla2xxx/qla_def.h  |  8 ++++
> drivers/scsi/qla2xxx/qla_gbl.h  |  2 +-
> drivers/scsi/qla2xxx/qla_init.c | 69 ++++++++++++++++++++++++++-------
> drivers/scsi/qla2xxx/qla_iocb.c |  5 ++-
> 4 files changed, 66 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
> index ec0e987b71fa..d59e94ae0db4 100644
> --- a/drivers/scsi/qla2xxx/qla_def.h
> +++ b/drivers/scsi/qla2xxx/qla_def.h
> @@ -466,6 +466,14 @@ static inline be_id_t port_id_to_be_id(port_id_t port_id)
> return res;
> }
> 
> +struct tmf_arg {
> + struct qla_qpair *qpair;
> + struct fc_port *fcport;
> + struct scsi_qla_host *vha;
> + u64 lun;
> + u32 flags;
> +};
> +
> struct els_logo_payload {
> uint8_t opcode;
> uint8_t rsvd[3];
> diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
> index 9aba07c7bde4..ef11ce46381d 100644
> --- a/drivers/scsi/qla2xxx/qla_gbl.h
> +++ b/drivers/scsi/qla2xxx/qla_gbl.h
> @@ -69,7 +69,7 @@ extern int qla2x00_async_logout(struct scsi_qla_host *, fc_port_t *);
> extern int qla2x00_async_prlo(struct scsi_qla_host *, fc_port_t *);
> extern int qla2x00_async_adisc(struct scsi_qla_host *, fc_port_t *,
>     uint16_t *);
> -extern int qla2x00_async_tm_cmd(fc_port_t *, uint32_t, uint32_t, uint32_t);
> +extern int qla2x00_async_tm_cmd(fc_port_t *, uint32_t, uint64_t, uint32_t);
> struct qla_work_evt *qla2x00_alloc_work(struct scsi_qla_host *,
>     enum qla_work_type);
> extern int qla24xx_async_gnl(struct scsi_qla_host *, fc_port_t *);
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index ec0423ec6681..035d1984e2bd 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -2020,17 +2020,19 @@ static void qla2x00_tmf_sp_done(srb_t *sp, int res)
> complete(&tmf->u.tmf.comp);
> }
> 
> -int
> -qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
> - uint32_t tag)
> +static int
> +__qla2x00_async_tm_cmd(struct tmf_arg *arg)
> {
> - struct scsi_qla_host *vha = fcport->vha;
> + struct scsi_qla_host *vha = arg->vha;
> struct srb_iocb *tm_iocb;
> srb_t *sp;
> + unsigned long flags;
> int rval = QLA_FUNCTION_FAILED;
> 
> + fc_port_t *fcport = arg->fcport;
> +
> /* ref: INIT */
> - sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
> + sp = qla2xxx_get_qpair_sp(vha, arg->qpair, fcport, GFP_KERNEL);
> if (!sp)
> goto done;
> 
> @@ -2043,15 +2045,15 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
> 
> tm_iocb = &sp->u.iocb_cmd;
> init_completion(&tm_iocb->u.tmf.comp);
> - tm_iocb->u.tmf.flags = flags;
> - tm_iocb->u.tmf.lun = lun;
> + tm_iocb->u.tmf.flags = arg->flags;
> + tm_iocb->u.tmf.lun = arg->lun;
> 
> + rval = qla2x00_start_sp(sp);
> ql_dbg(ql_dbg_taskm, vha, 0x802f,
> -    "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x.\n",
> +    "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x ctrl=%x.\n",
>    sp->handle, fcport->loop_id, fcport->d_id.b.domain,
> -    fcport->d_id.b.area, fcport->d_id.b.al_pa);
> +    fcport->d_id.b.area, fcport->d_id.b.al_pa, arg->flags);
> 
> - rval = qla2x00_start_sp(sp);
> if (rval != QLA_SUCCESS)
> goto done_free_sp;
> wait_for_completion(&tm_iocb->u.tmf.comp);
> @@ -2065,12 +2067,14 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
> 
> if (!test_bit(UNLOADING, &vha->dpc_flags) && !IS_QLAFX00(vha->hw)) {
> flags = tm_iocb->u.tmf.flags;
> - lun = (uint16_t)tm_iocb->u.tmf.lun;
> + if (flags & (TCF_LUN_RESET|TCF_ABORT_TASK_SET|
> + TCF_CLEAR_TASK_SET|TCF_CLEAR_ACA))
> + flags = MK_SYNC_ID_LUN;
> + else
> + flags = MK_SYNC_ID;
> 
> - /* Issue Marker IOCB */
> - qla2x00_marker(vha, vha->hw->base_qpair,
> -    fcport->loop_id, lun,
> -    flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
> + qla2x00_marker(vha, sp->qpair,
> +    sp->fcport->loop_id, arg->lun, flags);
> }
> 
> done_free_sp:
> @@ -2080,6 +2084,41 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
> return rval;
> }
> 
> +int
> +qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint64_t lun,
> +     uint32_t tag)
> +{
> + struct scsi_qla_host *vha = fcport->vha;
> + struct qla_qpair *qpair;
> + struct tmf_arg a;
> + struct completion comp;
> + int i, rval;
> +
> + init_completion(&comp);
> + a.vha = fcport->vha;
> + a.fcport = fcport;
> + a.lun = lun;
> +
> + if (vha->hw->mqenable) {
> + for (i = 0; i < vha->hw->num_qpairs; i++) {
> + qpair = vha->hw->queue_pair_map[i];
> + if (!qpair)
> + continue;
> + a.qpair = qpair;
> + a.flags = flags|TCF_NOTMCMD_TO_TARGET;
> + rval = __qla2x00_async_tm_cmd(&a);
> + if (rval)
> + break;
> + }
> + }
> +
> + a.qpair = vha->hw->base_qpair;
> + a.flags = flags;
> + rval = __qla2x00_async_tm_cmd(&a);
> +
> + return rval;
> +}
> +
> int
> qla24xx_async_abort_command(srb_t *sp)
> {
> diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
> index b9b3e6f80ea9..b02039601cc0 100644
> --- a/drivers/scsi/qla2xxx/qla_iocb.c
> +++ b/drivers/scsi/qla2xxx/qla_iocb.c
> @@ -2541,7 +2541,7 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk)
> scsi_qla_host_t *vha = fcport->vha;
> struct qla_hw_data *ha = vha->hw;
> struct srb_iocb *iocb = &sp->u.iocb_cmd;
> - struct req_que *req = vha->req;
> + struct req_que *req = sp->qpair->req;
> 
> flags = iocb->u.tmf.flags;
> lun = iocb->u.tmf.lun;
> @@ -2557,7 +2557,8 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk)
> tsk->port_id[2] = fcport->d_id.b.domain;
> tsk->vp_index = fcport->vha->vp_idx;
> 
> - if (flags == TCF_LUN_RESET) {
> + if (flags & (TCF_LUN_RESET | TCF_ABORT_TASK_SET|
> +    TCF_CLEAR_TASK_SET|TCF_CLEAR_ACA)) {
> int_to_scsilun(lun, &tsk->lun);
> host_to_fcp_swap((uint8_t *)&tsk->lun,
> sizeof(tsk->lun));
> -- 
> 2.23.1
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx <mailto:himanshu.madhani@xxxxxxxxxx>>

-- 
Himanshu Madhani Oracle Linux Engineering





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux