On Mon, 2019-11-11 at 15:03 -0800, James Smart wrote: > Currently, cpu_map[cpu#]->hdwq is left to equal > LPFC_VECTOR_MAP_EMPTY for not present CPUs. If a CPU > is dynamically hot-added, it is possible we may crash due to > not assigning an allocated hdwq. > > Correct by assigning a hdwq at initialization for all > not-present cpu's. > > Fixes: dcaa21367938 ("scsi: lpfc: Change default IRQ model on AMD architectures") > Signed-off-by: Dick Kennedy <dick.kennedy@xxxxxxxxxxxx> > Signed-off-by: James Smart <jsmart2021@xxxxxxxxx> > --- > Issue applies as of the 12.2.0.0 patch kit, but this fix requires > the above patch set for resolution. Referenced patch is in the > 5.5/scsi-queue branch > --- > drivers/scsi/lpfc/lpfc_init.c | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c > index 480d5a28c4f5..2b0e1097f727 100644 > --- a/drivers/scsi/lpfc/lpfc_init.c > +++ b/drivers/scsi/lpfc/lpfc_init.c > @@ -11004,7 +11004,7 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors) > cpu, cpup->phys_id, cpup->core_id, > cpup->hdwq, cpup->eq, cpup->flag); > } > - /* Finally we need to associate a hdwq with each cpu_map entry > + /* Associate a hdwq with each cpu_map entry > * This will be 1 to 1 - hdwq to cpu, unless there are less > * hardware queues then CPUs. For that case we will just round-robin > * the available hardware queues as they get assigned to CPUs. > @@ -11083,6 +11083,23 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors) > cpup->hdwq, cpup->eq, cpup->flag); > } > > + /* > + * Initialize the cpu_map slots for not-present cpus in case > + * a cpu is hot-added. Perform a simple hdwq round robin assignment. > + */ > + idx = 0; > + for_each_possible_cpu(cpu) { > + cpup = &phba->sli4_hba.cpu_map[cpu]; > + if (cpup->hdwq != LPFC_VECTOR_MAP_EMPTY) > + continue; > + > + cpup->hdwq = idx++ % phba->cfg_hdw_queue; > + lpfc_printf_log(phba, KERN_INFO, LOG_INIT, > + "3340 Set Affinity: not present " > + "CPU %d hdwq %d\n", > + cpu, cpup->hdwq); > + } > + > /* The cpu_map array will be used later during initialization > * when EQ / CQ / WQs are allocated and configured. > */ Reviewed-by: Ewan D. Milne <emilne@xxxxxxxxxx>