diff options
author | James Smart <jsmart2021@gmail.com> | 2019-11-12 00:03:59 +0100 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2019-11-13 04:21:33 +0100 |
commit | bc227dde0d8b687aa525d01b0df5556d4d37eca3 (patch) | |
tree | 1477db7ca50891680da360f28a14cd4dbe2f16ee /drivers/scsi | |
parent | scsi: lpfc: fix inlining of lpfc_sli4_cleanup_poll_list() (diff) | |
download | linux-bc227dde0d8b687aa525d01b0df5556d4d37eca3.tar.xz linux-bc227dde0d8b687aa525d01b0df5556d4d37eca3.zip |
scsi: lpfc: Initialize cpu_map for not present cpus
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 CPUs.
Fixes: dcaa21367938 ("scsi: lpfc: Change default IRQ model on AMD architectures")
Link: https://lore.kernel.org/r/20191111230401.12958-5-jsmart2021@gmail.com
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 303bfff0ecc8..e9323889f199 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -11004,7 +11004,7 @@ found_any: 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 @@ found_any: 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. */ |