IB/hfi1: Avoid credit return allocation for cpu-less NUMA nodes
authorHarish Chegondi <harish.chegondi@intel.com>
Thu, 8 Dec 2016 03:34:19 +0000 (19:34 -0800)
committerDoug Ledford <dledford@redhat.com>
Sun, 11 Dec 2016 20:29:42 +0000 (15:29 -0500)
Do not allocate credit return base and DMA memory for
NUMA nodes without CPUs.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Harish Chegondi <harish.chegondi@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/affinity.c
drivers/infiniband/hw/hfi1/affinity.h
drivers/infiniband/hw/hfi1/pio.c

index a26a9a0..4962b6e 100644 (file)
@@ -125,6 +125,7 @@ int node_affinity_init(void)
                                cpumask_weight(topology_sibling_cpumask(
                                        cpumask_first(&node_affinity.proc.mask)
                                        ));
+       node_affinity.num_possible_nodes = num_possible_nodes();
        node_affinity.num_online_nodes = num_online_nodes();
        node_affinity.num_online_cpus = num_online_cpus();
 
@@ -135,7 +136,7 @@ int node_affinity_init(void)
         */
        init_real_cpu_mask();
 
-       hfi1_per_node_cntr = kcalloc(num_possible_nodes(),
+       hfi1_per_node_cntr = kcalloc(node_affinity.num_possible_nodes,
                                     sizeof(*hfi1_per_node_cntr), GFP_KERNEL);
        if (!hfi1_per_node_cntr)
                return -ENOMEM;
index ef4ebc3..c9453b3 100644 (file)
@@ -111,6 +111,7 @@ struct hfi1_affinity_node_list {
        struct cpumask real_cpu_mask;
        struct cpu_mask_set proc;
        int num_core_siblings;
+       int num_possible_nodes;
        int num_online_nodes;
        int num_online_cpus;
        struct mutex lock; /* protects affinity nodes */
index 75c4dea..3d5dac2 100644 (file)
@@ -2036,21 +2036,10 @@ freesc15:
 int init_credit_return(struct hfi1_devdata *dd)
 {
        int ret;
-       int num_numa;
        int i;
 
-       num_numa = num_online_nodes();
-       /* enforce the expectation that the numas are compact */
-       for (i = 0; i < num_numa; i++) {
-               if (!node_online(i)) {
-                       dd_dev_err(dd, "NUMA nodes are not compact\n");
-                       ret = -EINVAL;
-                       goto done;
-               }
-       }
-
        dd->cr_base = kcalloc(
-               num_numa,
+               node_affinity.num_possible_nodes,
                sizeof(struct credit_return_base),
                GFP_KERNEL);
        if (!dd->cr_base) {
@@ -2058,7 +2047,7 @@ int init_credit_return(struct hfi1_devdata *dd)
                ret = -ENOMEM;
                goto done;
        }
-       for (i = 0; i < num_numa; i++) {
+       for_each_node_with_cpus(i) {
                int bytes = TXE_NUM_CONTEXTS * sizeof(struct credit_return);
 
                set_dev_node(&dd->pcidev->dev, i);
@@ -2085,14 +2074,11 @@ done:
 
 void free_credit_return(struct hfi1_devdata *dd)
 {
-       int num_numa;
        int i;
 
        if (!dd->cr_base)
                return;
-
-       num_numa = num_online_nodes();
-       for (i = 0; i < num_numa; i++) {
+       for (i = 0; i < node_affinity.num_possible_nodes; i++) {
                if (dd->cr_base[i].va) {
                        dma_free_coherent(&dd->pcidev->dev,
                                          TXE_NUM_CONTEXTS *