Whamcloud - gitweb
LU-10997 build: add files to .gitignore
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-cpu.c
index b7d6193..2c6628d 100644 (file)
  * General Public License version 2 for more details (a copy is included
  * in the LICENSE file that accompanied this code).
  *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 021110-1307, USA
- *
  * GPL HEADER END
  */
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  *
- * Copyright (c) 2012, 2016, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -72,25 +67,25 @@ void cfs_cpt_table_free(struct cfs_cpt_table *cptab)
 {
        int i;
 
-       if (cptab->ctb_cpu2cpt != NULL) {
+       if (cptab->ctb_cpu2cpt) {
                LIBCFS_FREE(cptab->ctb_cpu2cpt,
                            nr_cpu_ids * sizeof(cptab->ctb_cpu2cpt[0]));
        }
 
-       if (cptab->ctb_node2cpt != NULL) {
+       if (cptab->ctb_node2cpt) {
                LIBCFS_FREE(cptab->ctb_node2cpt,
                            nr_node_ids * sizeof(cptab->ctb_node2cpt[0]));
        }
 
-       for (i = 0; cptab->ctb_parts != NULL && i < cptab->ctb_nparts; i++) {
+       for (i = 0; cptab->ctb_parts && i < cptab->ctb_nparts; i++) {
                struct cfs_cpu_partition *part = &cptab->ctb_parts[i];
 
-               if (part->cpt_nodemask != NULL) {
+               if (part->cpt_nodemask) {
                        LIBCFS_FREE(part->cpt_nodemask,
                                    sizeof(*part->cpt_nodemask));
                }
 
-               if (part->cpt_cpumask != NULL)
+               if (part->cpt_cpumask)
                        LIBCFS_FREE(part->cpt_cpumask, cpumask_size());
 
                if (part->cpt_distance) {
@@ -100,14 +95,14 @@ void cfs_cpt_table_free(struct cfs_cpt_table *cptab)
                }
        }
 
-       if (cptab->ctb_parts != NULL) {
+       if (cptab->ctb_parts) {
                LIBCFS_FREE(cptab->ctb_parts,
                            cptab->ctb_nparts * sizeof(cptab->ctb_parts[0]));
        }
 
-       if (cptab->ctb_nodemask != NULL)
+       if (cptab->ctb_nodemask)
                LIBCFS_FREE(cptab->ctb_nodemask, sizeof(*cptab->ctb_nodemask));
-       if (cptab->ctb_cpumask != NULL)
+       if (cptab->ctb_cpumask)
                LIBCFS_FREE(cptab->ctb_cpumask, cpumask_size());
 
        LIBCFS_FREE(cptab, sizeof(*cptab));
@@ -120,58 +115,99 @@ struct cfs_cpt_table *cfs_cpt_table_alloc(int ncpt)
        int i;
 
        LIBCFS_ALLOC(cptab, sizeof(*cptab));
-       if (cptab == NULL)
+       if (!cptab)
                return NULL;
 
        cptab->ctb_nparts = ncpt;
 
        LIBCFS_ALLOC(cptab->ctb_cpumask, cpumask_size());
-       LIBCFS_ALLOC(cptab->ctb_nodemask, sizeof(*cptab->ctb_nodemask));
+       if (!cptab->ctb_cpumask)
+               goto failed_alloc_cpumask;
 
-       if (cptab->ctb_cpumask == NULL || cptab->ctb_nodemask == NULL)
-               goto failed;
+       LIBCFS_ALLOC(cptab->ctb_nodemask, sizeof(*cptab->ctb_nodemask));
+       if (!cptab->ctb_nodemask)
+               goto failed_alloc_nodemask;
 
        LIBCFS_ALLOC(cptab->ctb_cpu2cpt,
                     nr_cpu_ids * sizeof(cptab->ctb_cpu2cpt[0]));
-       if (cptab->ctb_cpu2cpt == NULL)
-               goto failed;
+       if (!cptab->ctb_cpu2cpt)
+               goto failed_alloc_cpu2cpt;
 
        memset(cptab->ctb_cpu2cpt, -1,
               nr_cpu_ids * sizeof(cptab->ctb_cpu2cpt[0]));
 
        LIBCFS_ALLOC(cptab->ctb_node2cpt,
                     nr_node_ids * sizeof(cptab->ctb_node2cpt[0]));
-       if (cptab->ctb_node2cpt == NULL)
-               goto failed;
+       if (!cptab->ctb_node2cpt)
+               goto failed_alloc_node2cpt;
 
        memset(cptab->ctb_node2cpt, -1,
               nr_node_ids * sizeof(cptab->ctb_node2cpt[0]));
 
        LIBCFS_ALLOC(cptab->ctb_parts, ncpt * sizeof(cptab->ctb_parts[0]));
-       if (cptab->ctb_parts == NULL)
-               goto failed;
+       if (!cptab->ctb_parts)
+               goto failed_alloc_ctb_parts;
 
        for (i = 0; i < ncpt; i++) {
                struct cfs_cpu_partition *part = &cptab->ctb_parts[i];
 
                LIBCFS_ALLOC(part->cpt_cpumask, cpumask_size());
                if (!part->cpt_cpumask)
-                       goto failed;
+                       goto failed_setting_ctb_parts;
 
                LIBCFS_ALLOC(part->cpt_nodemask, sizeof(*part->cpt_nodemask));
                if (!part->cpt_nodemask)
-                       goto failed;
+                       goto failed_setting_ctb_parts;
 
                LIBCFS_ALLOC(part->cpt_distance,
-                       cptab->ctb_nparts * sizeof(part->cpt_distance[0]));
+                            cptab->ctb_nparts * sizeof(part->cpt_distance[0]));
                if (!part->cpt_distance)
-                       goto failed;
+                       goto failed_setting_ctb_parts;
        }
 
        return cptab;
 
-failed:
-       cfs_cpt_table_free(cptab);
+failed_setting_ctb_parts:
+       while (i-- >= 0) {
+               struct cfs_cpu_partition *part = &cptab->ctb_parts[i];
+
+               if (part->cpt_nodemask) {
+                       LIBCFS_FREE(part->cpt_nodemask,
+                                   sizeof(*part->cpt_nodemask));
+               }
+
+               if (part->cpt_cpumask)
+                       LIBCFS_FREE(part->cpt_cpumask, cpumask_size());
+
+               if (part->cpt_distance) {
+                       LIBCFS_FREE(part->cpt_distance,
+                               cptab->ctb_nparts *
+                                       sizeof(part->cpt_distance[0]));
+               }
+       }
+
+       if (cptab->ctb_parts) {
+               LIBCFS_FREE(cptab->ctb_parts,
+                           cptab->ctb_nparts * sizeof(cptab->ctb_parts[0]));
+       }
+failed_alloc_ctb_parts:
+       if (cptab->ctb_node2cpt) {
+               LIBCFS_FREE(cptab->ctb_node2cpt,
+                           nr_node_ids * sizeof(cptab->ctb_node2cpt[0]));
+       }
+failed_alloc_node2cpt:
+       if (cptab->ctb_cpu2cpt) {
+               LIBCFS_FREE(cptab->ctb_cpu2cpt,
+                           nr_cpu_ids * sizeof(cptab->ctb_cpu2cpt[0]));
+       }
+failed_alloc_cpu2cpt:
+       if (cptab->ctb_nodemask)
+               LIBCFS_FREE(cptab->ctb_nodemask, sizeof(*cptab->ctb_nodemask));
+failed_alloc_nodemask:
+       if (cptab->ctb_cpumask)
+               LIBCFS_FREE(cptab->ctb_cpumask, cpumask_size());
+failed_alloc_cpumask:
+       LIBCFS_FREE(cptab, sizeof(*cptab));
        return NULL;
 }
 EXPORT_SYMBOL(cfs_cpt_table_alloc);
@@ -234,7 +270,7 @@ int cfs_cpt_distance_print(struct cfs_cpt_table *cptab, char *buf, int len)
                tmp += rc;
                for (j = 0; j < cptab->ctb_nparts; j++) {
                        rc = snprintf(tmp, len, " %d:%d",
-                               j, cptab->ctb_parts[i].cpt_distance[j]);
+                                     j, cptab->ctb_parts[i].cpt_distance[j]);
                        len -= rc;
                        if (len <= 0)
                                goto err;
@@ -299,7 +335,7 @@ nodemask_t *cfs_cpt_nodemask(struct cfs_cpt_table *cptab, int cpt)
 }
 EXPORT_SYMBOL(cfs_cpt_nodemask);
 
-unsigned cfs_cpt_distance(struct cfs_cpt_table *cptab, int cpt1, int cpt2)
+unsigned int cfs_cpt_distance(struct cfs_cpt_table *cptab, int cpt1, int cpt2)
 {
        LASSERT(cpt1 == CFS_CPT_ANY || (cpt1 >= 0 && cpt1 < cptab->ctb_nparts));
        LASSERT(cpt2 == CFS_CPT_ANY || (cpt2 >= 0 && cpt2 < cptab->ctb_nparts));
@@ -315,13 +351,13 @@ EXPORT_SYMBOL(cfs_cpt_distance);
  * Calculate the maximum NUMA distance between all nodes in the
  * from_mask and all nodes in the to_mask.
  */
-static unsigned cfs_cpt_distance_calculate(nodemask_t *from_mask,
-                                          nodemask_t *to_mask)
+static unsigned int cfs_cpt_distance_calculate(nodemask_t *from_mask,
+                                              nodemask_t *to_mask)
 {
-       unsigned maximum;
-       unsigned distance;
-       int to;
+       unsigned int maximum;
+       unsigned int distance;
        int from;
+       int to;
 
        maximum = 0;
        for_each_node_mask(from, *from_mask) {
@@ -352,43 +388,45 @@ static void cfs_cpt_del_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
 
 static void cfs_cpt_add_node(struct cfs_cpt_table *cptab, int cpt, int node)
 {
-       int cpt2;
        struct cfs_cpu_partition *part;
-       struct cfs_cpu_partition *part2;
 
        if (!node_isset(node, *cptab->ctb_nodemask)) {
+               unsigned int dist;
+
                /* first time node is added to the CPT table */
                node_set(node, *cptab->ctb_nodemask);
                cptab->ctb_node2cpt[node] = cpt;
-               cptab->ctb_distance = cfs_cpt_distance_calculate(
-                                                       cptab->ctb_nodemask,
-                                                       cptab->ctb_nodemask);
+
+               dist = cfs_cpt_distance_calculate(cptab->ctb_nodemask,
+                                                 cptab->ctb_nodemask);
+               cptab->ctb_distance = dist;
        }
 
        part = &cptab->ctb_parts[cpt];
        if (!node_isset(node, *part->cpt_nodemask)) {
+               int cpt2;
+
                /* first time node is added to this CPT */
                node_set(node, *part->cpt_nodemask);
                for (cpt2 = 0; cpt2 < cptab->ctb_nparts; cpt2++) {
+                       struct cfs_cpu_partition *part2;
+                       unsigned int dist;
+
                        part2 = &cptab->ctb_parts[cpt2];
-                       part->cpt_distance[cpt2] = cfs_cpt_distance_calculate(
-                                               part->cpt_nodemask,
-                                               part2->cpt_nodemask);
-                       part2->cpt_distance[cpt] = cfs_cpt_distance_calculate(
-                                               part2->cpt_nodemask,
-                                               part->cpt_nodemask);
+                       dist = cfs_cpt_distance_calculate(part->cpt_nodemask,
+                                                         part2->cpt_nodemask);
+                       part->cpt_distance[cpt2] = dist;
+                       dist = cfs_cpt_distance_calculate(part2->cpt_nodemask,
+                                                         part->cpt_nodemask);
+                       part2->cpt_distance[cpt] = dist;
                }
        }
 }
 
 static void cfs_cpt_del_node(struct cfs_cpt_table *cptab, int cpt, int node)
 {
+       struct cfs_cpu_partition *part = &cptab->ctb_parts[cpt];
        int cpu;
-       int cpt2;
-       struct cfs_cpu_partition *part;
-       struct cfs_cpu_partition *part2;
-
-       part = &cptab->ctb_parts[cpt];
 
        for_each_cpu(cpu, part->cpt_cpumask) {
                /* this CPT has other CPU belonging to this node? */
@@ -397,18 +435,24 @@ static void cfs_cpt_del_node(struct cfs_cpt_table *cptab, int cpt, int node)
        }
 
        if (cpu >= nr_cpu_ids && node_isset(node,  *part->cpt_nodemask)) {
+               int cpt2;
+
                /* No more CPUs in the node for this CPT. */
                node_clear(node, *part->cpt_nodemask);
                for (cpt2 = 0; cpt2 < cptab->ctb_nparts; cpt2++) {
+                       struct cfs_cpu_partition *part2;
+                       unsigned int dist;
+
                        part2 = &cptab->ctb_parts[cpt2];
                        if (node_isset(node, *part2->cpt_nodemask))
                                cptab->ctb_node2cpt[node] = cpt2;
-                       part->cpt_distance[cpt2] = cfs_cpt_distance_calculate(
-                                               part->cpt_nodemask,
-                                               part2->cpt_nodemask);
-                       part2->cpt_distance[cpt] = cfs_cpt_distance_calculate(
-                                               part2->cpt_nodemask,
-                                               part->cpt_nodemask);
+
+                       dist = cfs_cpt_distance_calculate(part->cpt_nodemask,
+                                                         part2->cpt_nodemask);
+                       part->cpt_distance[cpt2] = dist;
+                       dist = cfs_cpt_distance_calculate(part2->cpt_nodemask,
+                                                         part->cpt_nodemask);
+                       part2->cpt_distance[cpt] = dist;
                }
        }
 
@@ -424,7 +468,7 @@ static void cfs_cpt_del_node(struct cfs_cpt_table *cptab, int cpt, int node)
                cptab->ctb_node2cpt[node] = -1;
                cptab->ctb_distance =
                        cfs_cpt_distance_calculate(cptab->ctb_nodemask,
-                                       cptab->ctb_nodemask);
+                                                  cptab->ctb_nodemask);
        }
 }
 
@@ -447,6 +491,7 @@ int cfs_cpt_set_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
                CDEBUG(D_INFO, "CPU %d is already in cpumask\n", cpu);
                return 0;
        }
+
        if (cpumask_test_cpu(cpu, cptab->ctb_parts[cpt].cpt_cpumask)) {
                CDEBUG(D_INFO, "CPU %d is already in partition %d cpumask\n",
                       cpu, cptab->ctb_cpu2cpt[cpu]);
@@ -473,13 +518,15 @@ void cfs_cpt_unset_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
                /* caller doesn't know the partition ID */
                cpt = cptab->ctb_cpu2cpt[cpu];
                if (cpt < 0) { /* not set in this CPT-table */
-                       CDEBUG(D_INFO, "Try to unset cpu %d which is "
-                                      "not in CPT-table %p\n", cpt, cptab);
+                       CDEBUG(D_INFO,
+                              "Try to unset cpu %d which is not in CPT-table %p\n",
+                              cpt, cptab);
                        return;
                }
 
        } else if (cpt != cptab->ctb_cpu2cpt[cpu]) {
-               CDEBUG(D_INFO, "CPU %d is not in CPU partition %d\n", cpu, cpt);
+               CDEBUG(D_INFO,
+                      "CPU %d is not in CPU partition %d\n", cpu, cpt);
                return;
        }
 
@@ -496,10 +543,11 @@ int cfs_cpt_set_cpumask(struct cfs_cpt_table *cptab, int cpt,
 {
        int cpu;
 
-       if (cpumask_weight(mask) == 0 ||
+       if (!cpumask_weight(mask) ||
            cpumask_any_and(mask, cpu_online_mask) >= nr_cpu_ids) {
-               CDEBUG(D_INFO, "No online CPU is found in the CPU mask "
-                              "for CPU partition %d\n", cpt);
+               CDEBUG(D_INFO,
+                      "No online CPU is found in the CPU mask for CPU partition %d\n",
+                      cpt);
                return 0;
        }
 
@@ -598,10 +646,10 @@ int cfs_cpt_spread_node(struct cfs_cpt_table *cptab, int cpt)
        /* convert CPU partition ID to HW node id */
 
        if (cpt < 0 || cpt >= cptab->ctb_nparts) {
-               mask  = cptab->ctb_nodemask;
+               mask = cptab->ctb_nodemask;
                rotor = cptab->ctb_spread_rotor++;
        } else {
-               mask  = cptab->ctb_parts[cpt].cpt_nodemask;
+               mask = cptab->ctb_parts[cpt].cpt_nodemask;
                rotor = cptab->ctb_parts[cpt].cpt_spread_rotor++;
                node  = cptab->ctb_parts[cpt].cpt_node;
        }
@@ -611,7 +659,7 @@ int cfs_cpt_spread_node(struct cfs_cpt_table *cptab, int cpt)
                rotor %= weight;
 
                for_each_node_mask(node, *mask) {
-                       if (rotor-- == 0)
+                       if (!rotor--)
                                return node;
                }
        }
@@ -630,7 +678,8 @@ int cfs_cpt_current(struct cfs_cpt_table *cptab, int remap)
                        return cpt;
 
                /* don't return negative value for safety of upper layer,
-                * instead we shadow the unknown cpu to a valid partition ID */
+                * instead we shadow the unknown cpu to a valid partition ID
+                */
                cpt = cpu % cptab->ctb_nparts;
        }
 
@@ -673,9 +722,8 @@ int cfs_cpt_bind(struct cfs_cpt_table *cptab, int cpt)
        }
 
        if (!cpumask_intersects(cpumask, cpu_online_mask)) {
-               CDEBUG(D_INFO, "No online CPU found in CPU partition %d, did "
-                       "someone do CPU hotplug on system? You might need to "
-                       "reload Lustre modules to keep system working well.\n",
+               CDEBUG(D_INFO,
+                      "No online CPU found in CPU partition %d, did someone do CPU hotplug on system? You might need to reload Lustre modules to keep system working well.\n",
                        cpt);
                return -ENODEV;
        }
@@ -686,7 +734,7 @@ int cfs_cpt_bind(struct cfs_cpt_table *cptab, int cpt)
 
                rc = set_cpus_allowed_ptr(current, cpumask);
                set_mems_allowed(*nodemask);
-               if (rc == 0)
+               if (!rc)
                        schedule(); /* switch to allowed CPU */
 
                return rc;
@@ -730,7 +778,7 @@ static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt,
        /* allocate scratch buffer */
        LIBCFS_ALLOC(socket_mask, cpumask_size());
        LIBCFS_ALLOC(core_mask, cpumask_size());
-       if (socket_mask == NULL || core_mask == NULL) {
+       if (!socket_mask || !core_mask) {
                rc = -ENOMEM;
                goto out;
        }
@@ -742,8 +790,8 @@ static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt,
                cpumask_and(socket_mask, topology_core_cpumask(cpu), node_mask);
                while (!cpumask_empty(socket_mask)) {
                        /* get cpumask for hts in the same core */
-                       cpumask_and(core_mask,
-                                   topology_sibling_cpumask(cpu), node_mask);
+                       cpumask_and(core_mask, topology_sibling_cpumask(cpu),
+                                   node_mask);
 
                        for_each_cpu(i, core_mask) {
                                cpumask_clear_cpu(i, socket_mask);
@@ -758,7 +806,7 @@ static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt,
                                        goto out;
                                }
 
-                               if (--number == 0)
+                               if (!--number)
                                        goto out;
                        }
                        cpu = cpumask_first(socket_mask);
@@ -766,9 +814,9 @@ static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt,
        }
 
 out:
-       if (core_mask != NULL)
+       if (core_mask)
                LIBCFS_FREE(core_mask, cpumask_size());
-       if (socket_mask != NULL)
+       if (socket_mask)
                LIBCFS_FREE(socket_mask, cpumask_size());
        return rc;
 }
@@ -778,19 +826,20 @@ out:
 static int cfs_cpt_num_estimate(void)
 {
        int nthr = cpumask_weight(topology_sibling_cpumask(smp_processor_id()));
-       int ncpu  = num_online_cpus();
+       int ncpu = num_online_cpus();
        int ncpt = 1;
 
        if (ncpu > CPT_WEIGHT_MIN)
-               for (ncpt = 2; ncpu > 2 * nthr * ncpt; ncpt++);
-                       /* nothing */
+               for (ncpt = 2; ncpu > 2 * nthr * ncpt; ncpt++)
+                       /* nothing */
 
 #if (BITS_PER_LONG == 32)
        /* config many CPU partitions on 32-bit system could consume
-        * too much memory */
+        * too much memory
+        */
        ncpt = min(2, ncpt);
 #endif
-       while (ncpu % ncpt != 0)
+       while (ncpu % ncpt)
                ncpt--; /* worst case is 1 */
 
        return ncpt;
@@ -811,21 +860,19 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt)
                ncpt = num;
 
        if (ncpt > num_online_cpus() || ncpt > 4 * num) {
-               CWARN("CPU partition number %d is larger than suggested "
-                     "value (%d), your system may have performance "
-                     "issue or run out of memory while under pressure\n",
+               CWARN("CPU partition number %d is larger than suggested value (%d), your system may have performance issue or run out of memory while under pressure\n",
                      ncpt, num);
        }
 
        cptab = cfs_cpt_table_alloc(ncpt);
-       if (cptab == NULL) {
+       if (!cptab) {
                CERROR("Failed to allocate CPU map(%d)\n", ncpt);
                rc = -ENOMEM;
                goto failed;
        }
 
        LIBCFS_ALLOC(node_mask, cpumask_size());
-       if (node_mask == NULL) {
+       if (!node_mask) {
                CERROR("Failed to allocate scratch cpumask\n");
                rc = -ENOMEM;
                goto failed;
@@ -844,7 +891,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt)
                                                  num - ncpu);
                        if (rc < 0) {
                                rc = -EINVAL;
-                               goto failed;
+                               goto failed_mask;
                        }
 
                        ncpu = cpumask_weight(part->cpt_cpumask);
@@ -856,17 +903,17 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt)
        }
 
        LIBCFS_FREE(node_mask, cpumask_size());
-       return cptab;
 
-failed:
-       CERROR("Failed (rc=%d) to setup CPU partition table with %d "
-               "partitions, online HW NUMA nodes: %d, HW CPU cores: %d.\n",
-               rc, ncpt, num_online_nodes(), num_online_cpus());
+       return cptab;
 
-       if (node_mask != NULL)
+failed_mask:
+       if (node_mask)
                LIBCFS_FREE(node_mask, cpumask_size());
+failed:
+       CERROR("Failed (rc = %d) to setup CPU partition table with %d partitions, online HW NUMA nodes: %d, HW CPU cores: %d.\n",
+              rc, ncpt, num_online_nodes(), num_online_cpus());
 
-       if (cptab != NULL)
+       if (cptab)
                cfs_cpt_table_free(cptab);
 
        return ERR_PTR(rc);
@@ -880,14 +927,14 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
        char *str;
        int node = 0;
        int ncpt = 0;
-       int cpt  = 0;
+       int cpt = 0;
        int high;
        int rc;
        int c;
        int i;
 
        pattern_dup = kstrdup(pattern, GFP_KERNEL);
-       if (pattern_dup == NULL) {
+       if (!pattern_dup) {
                CERROR("Failed to duplicate pattern '%s'\n", pattern);
                return ERR_PTR(-ENOMEM);
        }
@@ -909,7 +956,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
                }
        }
 
-       if (ncpt == 0) { /* scanning bracket which is mark of partition */
+       if (!ncpt) { /* scanning bracket which is mark of partition */
                bracket = str;
                while ((bracket = strchr(bracket, '['))) {
                        bracket++;
@@ -917,7 +964,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
                }
        }
 
-       if (ncpt == 0 ||
+       if (!ncpt ||
            (node && ncpt > num_online_nodes()) ||
            (!node && ncpt > num_online_cpus())) {
                CERROR("Invalid pattern '%s', or too many partitions %d\n",
@@ -927,7 +974,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
        }
 
        cptab = cfs_cpt_table_alloc(ncpt);
-       if (cptab == NULL) {
+       if (!cptab) {
                CERROR("Failed to allocate CPU partition table\n");
                rc = -ENOMEM;
                goto err_free_str;
@@ -956,14 +1003,14 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
                int n;
 
                bracket = strchr(str, '[');
-               if (bracket == NULL) {
-                       if (*str != 0) {
+               if (!bracket) {
+                       if (*str) {
                                CERROR("Invalid pattern '%s'\n", str);
                                rc = -EINVAL;
                                goto err_free_table;
                        } else if (c != ncpt) {
                                CERROR("Expect %d partitions but found %d\n",
-                                       ncpt, c);
+                                      ncpt, c);
                                rc = -EINVAL;
                                goto err_free_table;
                        }
@@ -983,7 +1030,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
                        goto err_free_table;
                }
 
-               if (cfs_cpt_weight(cptab, cpt) != 0) {
+               if (cfs_cpt_weight(cptab, cpt)) {
                        CERROR("Partition %d has already been set.\n", cpt);
                        rc = -EPERM;
                        goto err_free_table;
@@ -997,9 +1044,9 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
                }
 
                bracket = strchr(str, ']');
-               if (bracket == NULL) {
-                       CERROR("Missing right bracket for partition "
-                               "%d in '%s'\n", cpt, str);
+               if (!bracket) {
+                       CERROR("Missing right bracket for partition %d in '%s'\n",
+                              cpt, str);
                        rc = -EINVAL;
                        goto err_free_table;
                }
@@ -1014,7 +1061,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern)
 
                list_for_each_entry(range, &el->el_exprs, re_link) {
                        for (i = range->re_lo; i <= range->re_hi; i++) {
-                               if ((i - range->re_lo) % range->re_stride != 0)
+                               if ((i - range->re_lo) % range->re_stride)
                                        continue;
 
                                rc = node ? cfs_cpt_set_node(cptab, cpt, i)
@@ -1130,12 +1177,14 @@ int cfs_cpu_init(void)
                                        "fs/lustre/cfe:dead", NULL,
                                        cfs_cpu_dead);
        if (ret < 0)
-               goto failed;
+               goto failed_cpu_dead;
+
        ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
                                        "fs/lustre/cfe:online",
                                        cfs_cpu_online, NULL);
        if (ret < 0)
-               goto failed;
+               goto failed_cpu_online;
+
        lustre_cpu_online = ret;
 #else
        register_hotcpu_notifier(&cfs_cpu_notifier);
@@ -1144,24 +1193,25 @@ int cfs_cpu_init(void)
        ret = -EINVAL;
 
        get_online_cpus();
-       if (*cpu_pattern != 0) {
+       if (*cpu_pattern) {
                cfs_cpt_table = cfs_cpt_table_create_pattern(cpu_pattern);
                if (IS_ERR(cfs_cpt_table)) {
                        CERROR("Failed to create cptab from pattern '%s'\n",
-                               cpu_pattern);
+                              cpu_pattern);
                        ret = PTR_ERR(cfs_cpt_table);
-                       goto failed;
+                       goto failed_alloc_table;
                }
 
        } else {
                cfs_cpt_table = cfs_cpt_table_create(cpu_npartitions);
                if (IS_ERR(cfs_cpt_table)) {
                        CERROR("Failed to create cptab with npartitions %d\n",
-                               cpu_npartitions);
+                              cpu_npartitions);
                        ret = PTR_ERR(cfs_cpt_table);
-                       goto failed;
+                       goto failed_alloc_table;
                }
        }
+
        put_online_cpus();
 
        LCONSOLE(0, "HW NUMA nodes: %d, HW CPU cores: %d, npartitions: %d\n",
@@ -1169,9 +1219,23 @@ int cfs_cpu_init(void)
                 cfs_cpt_number(cfs_cpt_table));
        return 0;
 
-failed:
+failed_alloc_table:
        put_online_cpus();
-       cfs_cpu_fini();
+
+       if (!IS_ERR_OR_NULL(cfs_cpt_table))
+               cfs_cpt_table_free(cfs_cpt_table);
+
+#ifdef CONFIG_HOTPLUG_CPU
+#ifdef HAVE_HOTPLUG_STATE_MACHINE
+       if (lustre_cpu_online > 0)
+               cpuhp_remove_state_nocalls(lustre_cpu_online);
+failed_cpu_online:
+       cpuhp_remove_state_nocalls(CPUHP_LUSTRE_CFS_DEAD);
+failed_cpu_dead:
+#else
+       unregister_hotcpu_notifier(&cfs_cpu_notifier);
+#endif /* !HAVE_HOTPLUG_STATE_MACHINE */
+#endif /* CONFIG_HOTPLUG_CPU */
        return ret;
 }