OSDN Git Service

scsi: lpfc: Initialize cpu_map for not present cpus
authorJames Smart <jsmart2021@gmail.com>
Mon, 11 Nov 2019 23:03:59 +0000 (15:03 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 13 Nov 2019 03:21:33 +0000 (22:21 -0500)
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>
drivers/scsi/lpfc/lpfc_init.c

index 303bfff..e932388 100644 (file)
@@ -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.
         */