Re: [PATCH 4/6] lpfc: Initialize cpu_map for not present cpus

Ewan D. Milne
2019-11-12T18:32:41Z

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@broadcom.com>
> Signed-off-by: James Smart <jsmart2021@gmail.com>
> ---
> 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@redhat.com>