> On Dec 23, 2021, at 11:07 PM, Nilesh Javali <njavali@xxxxxxxxxxx> wrote: > > From: Shreyas Deodhar <sdeodhar@xxxxxxxxxxx> > > Add ql2xnvme_queues module parameter to configure number of NVME queues > > Usage: > Number of NVMe Queues that can be configured. > Final value will be min(ql2xnvme_queues, num_cpus, num_chip_queues), > 1 - Minimum number of queues supported > 128 - Maximum number of queues supported > 8 - Default value > > Signed-off-by: Shreyas Deodhar <sdeodhar@xxxxxxxxxxx> > Signed-off-by: Nilesh Javali <njavali@xxxxxxxxxxx> > --- > drivers/scsi/qla2xxx/qla_gbl.h | 1 + > drivers/scsi/qla2xxx/qla_nvme.c | 16 ++++++++++++++-- > drivers/scsi/qla2xxx/qla_nvme.h | 4 ++++ > drivers/scsi/qla2xxx/qla_os.c | 8 ++++++++ > 4 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h > index 3f8b8bbabe6d..cedc347e3c33 100644 > --- a/drivers/scsi/qla2xxx/qla_gbl.h > +++ b/drivers/scsi/qla2xxx/qla_gbl.h > @@ -192,6 +192,7 @@ extern int ql2xfulldump_on_mpifail; > extern int ql2xsecenable; > extern int ql2xenforce_iocb_limit; > extern int ql2xabts_wait_nvme; > +extern u32 ql2xnvme_queues; > > extern int qla2x00_loop_reset(scsi_qla_host_t *); > extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); > diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c > index e22ec7cb65db..718c761ff5f8 100644 > --- a/drivers/scsi/qla2xxx/qla_nvme.c > +++ b/drivers/scsi/qla2xxx/qla_nvme.c > @@ -710,7 +710,7 @@ static struct nvme_fc_port_template qla_nvme_fc_transport = { > .fcp_io = qla_nvme_post_cmd, > .fcp_abort = qla_nvme_fcp_abort, > .map_queues = qla_nvme_map_queues, > - .max_hw_queues = 8, > + .max_hw_queues = DEF_NVME_HW_QUEUES, > .max_sgl_segments = 1024, > .max_dif_sgl_segments = 64, > .dma_boundary = 0xFFFFFFFF, > @@ -779,10 +779,22 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha) > > WARN_ON(vha->nvme_local_port); > > + if (ql2xnvme_queues < MIN_NVME_HW_QUEUES || ql2xnvme_queues > MAX_NVME_HW_QUEUES) { > + ql_log(ql_log_warn, vha, 0xfffd, > + "ql2xnvme_queues=%d is out of range(MIN:%d - MAX:%d). Resetting ql2xnvme_queues to:%d\n", > + ql2xnvme_queues, MIN_NVME_HW_QUEUES, MAX_NVME_HW_QUEUES, > + DEF_NVME_HW_QUEUES); > + ql2xnvme_queues = DEF_NVME_HW_QUEUES; > + } > + > qla_nvme_fc_transport.max_hw_queues = > - min((uint8_t)(qla_nvme_fc_transport.max_hw_queues), > + min((uint8_t)(ql2xnvme_queues), > (uint8_t)(ha->max_qpairs ? ha->max_qpairs : 1)); > > + ql_log(ql_log_info, vha, 0xfffb, > + "Number of NVME queues used for this port: %d\n", > + qla_nvme_fc_transport.max_hw_queues); > + > pinfo.node_name = wwn_to_u64(vha->node_name); > pinfo.port_name = wwn_to_u64(vha->port_name); > pinfo.port_role = FC_PORT_ROLE_NVME_INITIATOR; > diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h > index f81f219c7c7d..d0e3c0e07baa 100644 > --- a/drivers/scsi/qla2xxx/qla_nvme.h > +++ b/drivers/scsi/qla2xxx/qla_nvme.h > @@ -13,6 +13,10 @@ > #include "qla_def.h" > #include "qla_dsd.h" > > +#define MIN_NVME_HW_QUEUES 1 > +#define MAX_NVME_HW_QUEUES 128 > +#define DEF_NVME_HW_QUEUES 8 > + > #define NVME_ATIO_CMD_OFF 32 > #define NVME_FIRST_PACKET_CMDLEN (64 - NVME_ATIO_CMD_OFF) > #define Q2T_NVME_NUM_TAGS 2048 > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c > index c4b4b4496399..7d5159306112 100644 > --- a/drivers/scsi/qla2xxx/qla_os.c > +++ b/drivers/scsi/qla2xxx/qla_os.c > @@ -338,6 +338,14 @@ static void qla2x00_free_device(scsi_qla_host_t *); > static int qla2xxx_map_queues(struct Scsi_Host *shost); > static void qla2x00_destroy_deferred_work(struct qla_hw_data *); > > +u32 ql2xnvme_queues = DEF_NVME_HW_QUEUES; > +module_param(ql2xnvme_queues, uint, S_IRUGO); > +MODULE_PARM_DESC(ql2xnvme_queues, > + "Number of NVMe Queues that can be configured.\n" > + "Final value will be min(ql2xnvme_queues, num_cpus,num_chip_queues)\n" > + "1 - Minimum number of queues supported\n" > + "128 - Maximum number of queues supported\n" > + "8 - Default value"); > > static struct scsi_transport_template *qla2xxx_transport_template = NULL; > struct scsi_transport_template *qla2xxx_transport_vport_template = NULL; > -- > 2.23.1 > Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx> -- Himanshu Madhani Oracle Linux Engineering