On Wed, Jul 31, 2019 at 8:24 AM James Smart <jsmart2021@xxxxxxxxx> wrote: > > When SCSI-MQ is enabled, the SCSI-MQ layers will do pre-allocation of > MQ resources based on shost values set by the driver. In newer cases > of the driver, which attempts to set nr_hw_queues to the cpu count, > the multipliers become excessive, with a single shost having SCSI-MQ > pre-allocation reaching into the multiple GBytes range. NPIV, which > creates additional shosts, only multiply this overhead. On lower-memory > systems, this can exhaust system memory very quickly, resulting in a > system crash or failures in the driver or elsewhere due to low memory > conditions. > > After testing several scenarios, the situation can be mitigated by > limiting the value set in shost->nr_hw_queues to 4. Although the shost > values were changed, the driver still had per-cpu hardware queues of > its own that allowed parallelization per-cpu. Testing revealed that > even with the smallish number for nr_hw_queues for SCSI-MQ, performance > levels remained near maximum with the within-driver affiinitization. > > A module parameter was created to allow the value set for the > nr_hw_queues to be tunable. > > Signed-off-by: Dick Kennedy <dick.kennedy@xxxxxxxxxxxx> > Signed-off-by: James Smart <jsmart2021@xxxxxxxxx> > --- > drivers/scsi/lpfc/lpfc.h | 1 + > drivers/scsi/lpfc/lpfc_attr.c | 17 +++++++++++++++++ > drivers/scsi/lpfc/lpfc_init.c | 12 ++++++++---- > drivers/scsi/lpfc/lpfc_sli4.h | 5 +++++ > 4 files changed, 31 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h > index 2c3bb8a966e5..bade2e025ecf 100644 > --- a/drivers/scsi/lpfc/lpfc.h > +++ b/drivers/scsi/lpfc/lpfc.h > @@ -824,6 +824,7 @@ struct lpfc_hba { > uint32_t cfg_cq_poll_threshold; > uint32_t cfg_cq_max_proc_limit; > uint32_t cfg_fcp_cpu_map; > + uint32_t cfg_fcp_mq_threshold; > uint32_t cfg_hdw_queue; > uint32_t cfg_irq_chann; > uint32_t cfg_suppress_rsp; > diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c > index ea62322ffe2b..d267f57d1738 100644 > --- a/drivers/scsi/lpfc/lpfc_attr.c > +++ b/drivers/scsi/lpfc/lpfc_attr.c > @@ -5709,6 +5709,19 @@ LPFC_ATTR_RW(nvme_embed_cmd, 1, 0, 2, > "Embed NVME Command in WQE"); > > /* > + * lpfc_fcp_mq_threshold: Set the number of Hardware Queues the driver > + * will advertise it supports to the SCSI layer. > + * > + * 0 = Configure nr_hw_queues by the number of CPUs or HW queues. > + * 1,128 = Manually specify nr_hw_queue value to be advertised, > + * > + * Value range is [0,128]. Default value is 4. > + */ > +LPFC_ATTR_R(fcp_mq_threshold, LPFC_FCP_MQ_THRESHOLD_DEF, > + LPFC_FCP_MQ_THRESHOLD_MIN, LPFC_FCP_MQ_THRESHOLD_MAX, > + "Set the number of SCSI Queues advertised"); Hi James, Could the default hw queue count be set as numa node number? This way should work fine most of times. Thanks, Ming Lei