X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Flibcfs_cpu.c;h=955f1aa86f37b93626d66c29165281fee7d93b8e;hb=8addb60ebdd8817d95ec109c7697a0dffcc521a1;hp=c80f9d42552bf5b43b0e7146b4122b268c5cd2f2;hpb=32c7b181371c75c5a5e79c603972be09c3deb2d4;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/libcfs_cpu.c b/libcfs/libcfs/libcfs_cpu.c index c80f9d4..955f1aa8 100644 --- a/libcfs/libcfs/libcfs_cpu.c +++ b/libcfs/libcfs/libcfs_cpu.c @@ -79,8 +79,7 @@ struct cfs_cpt_table *cfs_cpt_table_alloc(int ncpt) cptab->ctb_nparts = ncpt; - LIBCFS_ALLOC(cptab->ctb_cpumask, cpumask_size()); - if (!cptab->ctb_cpumask) + if (!zalloc_cpumask_var(&cptab->ctb_cpumask, GFP_NOFS)) goto failed_alloc_cpumask; LIBCFS_ALLOC(cptab->ctb_nodemask, sizeof(*cptab->ctb_nodemask)); @@ -112,8 +111,7 @@ struct cfs_cpt_table *cfs_cpt_table_alloc(int ncpt) 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) + if (!zalloc_cpumask_var(&part->cpt_cpumask, GFP_NOFS)) goto failed_setting_ctb_parts; LIBCFS_ALLOC(part->cpt_nodemask, sizeof(*part->cpt_nodemask)); @@ -140,8 +138,7 @@ failed_setting_ctb_parts: sizeof(*part->cpt_nodemask)); } - if (part->cpt_cpumask) - LIBCFS_FREE(part->cpt_cpumask, cpumask_size()); + free_cpumask_var(part->cpt_cpumask); if (part->cpt_distance) { LIBCFS_FREE(part->cpt_distance, @@ -168,8 +165,7 @@ 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()); + free_cpumask_var(cptab->ctb_cpumask); failed_alloc_cpumask: LIBCFS_FREE(cptab, sizeof(*cptab)); return NULL; @@ -198,8 +194,7 @@ void cfs_cpt_table_free(struct cfs_cpt_table *cptab) sizeof(*part->cpt_nodemask)); } - if (part->cpt_cpumask) - LIBCFS_FREE(part->cpt_cpumask, cpumask_size()); + free_cpumask_var(part->cpt_cpumask); if (part->cpt_distance) { LIBCFS_FREE(part->cpt_distance, @@ -215,8 +210,7 @@ void cfs_cpt_table_free(struct cfs_cpt_table *cptab) if (cptab->ctb_nodemask) LIBCFS_FREE(cptab->ctb_nodemask, sizeof(*cptab->ctb_nodemask)); - if (cptab->ctb_cpumask) - LIBCFS_FREE(cptab->ctb_cpumask, cpumask_size()); + free_cpumask_var(cptab->ctb_cpumask); LIBCFS_FREE(cptab, sizeof(*cptab)); } @@ -325,12 +319,12 @@ int cfs_cpt_online(struct cfs_cpt_table *cptab, int cpt) } EXPORT_SYMBOL(cfs_cpt_online); -cpumask_t *cfs_cpt_cpumask(struct cfs_cpt_table *cptab, int cpt) +cpumask_var_t *cfs_cpt_cpumask(struct cfs_cpt_table *cptab, int cpt) { LASSERT(cpt == CFS_CPT_ANY || (cpt >= 0 && cpt < cptab->ctb_nparts)); return cpt == CFS_CPT_ANY ? - cptab->ctb_cpumask : cptab->ctb_parts[cpt].cpt_cpumask; + &cptab->ctb_cpumask : &cptab->ctb_parts[cpt].cpt_cpumask; } EXPORT_SYMBOL(cfs_cpt_cpumask); @@ -761,8 +755,8 @@ EXPORT_SYMBOL(cfs_cpt_bind); static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt, cpumask_t *node_mask, int number) { - cpumask_t *socket_mask = NULL; - cpumask_t *core_mask = NULL; + cpumask_var_t socket_mask; + cpumask_var_t core_mask; int rc = 0; int cpu; int i; @@ -784,13 +778,17 @@ static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt, return 0; } - /* allocate scratch buffer */ - LIBCFS_ALLOC(socket_mask, cpumask_size()); - LIBCFS_ALLOC(core_mask, cpumask_size()); - if (!socket_mask || !core_mask) { + /* + * Allocate scratch buffers + * As we cannot initialize a cpumask_var_t, we need + * to alloc both before we can risk trying to free either + */ + if (!zalloc_cpumask_var(&socket_mask, GFP_NOFS)) + rc = -ENOMEM; + if (!zalloc_cpumask_var(&core_mask, GFP_NOFS)) rc = -ENOMEM; + if (rc) goto out; - } while (!cpumask_empty(node_mask)) { cpu = cpumask_first(node_mask); @@ -823,10 +821,8 @@ static int cfs_cpt_choose_ncpus(struct cfs_cpt_table *cptab, int cpt, } out: - if (core_mask) - LIBCFS_FREE(core_mask, cpumask_size()); - if (socket_mask) - LIBCFS_FREE(socket_mask, cpumask_size()); + free_cpumask_var(socket_mask); + free_cpumask_var(core_mask); return rc; } @@ -857,7 +853,7 @@ static int cfs_cpt_num_estimate(void) static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt) { struct cfs_cpt_table *cptab = NULL; - cpumask_t *node_mask = NULL; + cpumask_var_t node_mask; int cpt = 0; int node; int num; @@ -868,7 +864,14 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt) if (ncpt <= 0) ncpt = num; - if (ncpt > num_online_cpus() || ncpt > 4 * num) { + if (ncpt > num_online_cpus()) { + rc = -EINVAL; + CERROR("libcfs: CPU partition count %d > cores %d: rc = %d\n", + ncpt, num_online_cpus(), rc); + goto failed; + } + + if (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", ncpt, num); } @@ -880,8 +883,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt) goto failed; } - LIBCFS_ALLOC(node_mask, cpumask_size()); - if (!node_mask) { + if (!zalloc_cpumask_var(&node_mask, GFP_NOFS)) { CERROR("Failed to allocate scratch cpumask\n"); rc = -ENOMEM; goto failed; @@ -897,7 +899,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt) int ncpu = cpumask_weight(part->cpt_cpumask); rc = cfs_cpt_choose_ncpus(cptab, cpt, node_mask, - num - ncpu); + (rem > 0) + num - ncpu); if (rc < 0) { rc = -EINVAL; goto failed_mask; @@ -911,13 +913,12 @@ static struct cfs_cpt_table *cfs_cpt_table_create(int ncpt) } } - LIBCFS_FREE(node_mask, cpumask_size()); + free_cpumask_var(node_mask); return cptab; failed_mask: - if (node_mask) - LIBCFS_FREE(node_mask, cpumask_size()); + free_cpumask_var(node_mask); 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()); @@ -948,7 +949,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern) return ERR_PTR(-ENOMEM); } - str = cfs_trimwhite(pattern_dup); + str = strim(pattern_dup); if (*str == 'n' || *str == 'N') { str++; /* skip 'N' char */ node = 1; /* NUMA pattern */ @@ -1006,7 +1007,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern) high = node ? nr_node_ids - 1 : nr_cpu_ids - 1; - for (str = cfs_trimwhite(str), c = 0; /* until break */; c++) { + for (str = strim(str), c = 0; /* until break */; c++) { struct cfs_range_expr *range; struct cfs_expr_list *el; int n; @@ -1045,7 +1046,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern) goto err_free_table; } - str = cfs_trimwhite(str + n); + str = strim(str + n); if (str != bracket) { CERROR("Invalid pattern '%s'\n", str); rc = -EINVAL; @@ -1091,7 +1092,7 @@ static struct cfs_cpt_table *cfs_cpt_table_create_pattern(const char *pattern) goto err_free_table; } - str = cfs_trimwhite(bracket + 1); + str = strim(bracket + 1); } kfree(pattern_dup); @@ -1230,7 +1231,7 @@ int cfs_cpu_init(void) failed_alloc_table: put_online_cpus(); - if (cfs_cpt_table) + if (!IS_ERR_OR_NULL(cfs_cpt_table)) cfs_cpt_table_free(cfs_cpt_table); #ifdef CONFIG_HOTPLUG_CPU