Commit c658b696 authored by Liang Zhen's avatar Liang Zhen Committed by Greg Kroah-Hartman

staging: lustre: libcfs: check mask returned by cpumask_of_node

cpumask_of_node can return NULL if NUMA node is unavailable,
in this case cfs_node_to_cpumask will try to copy from NULL
and cause kernel panic.
Signed-off-by: default avatarLiang Zhen <liang.zhen@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5751
Reviewed-on: http://review.whamcloud.com/13207Reviewed-by: default avatarLi Wei <wei.g.li@intel.com>
Reviewed-by: default avatarBobi Jam <bobijam@hotmail.com>
Reviewed-by: default avatarJames Simmons <uja.ornl@gmail.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarJames Simmons <jsimmons@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6314ccb6
...@@ -74,6 +74,17 @@ struct cfs_cpt_data { ...@@ -74,6 +74,17 @@ struct cfs_cpt_data {
static struct cfs_cpt_data cpt_data; static struct cfs_cpt_data cpt_data;
static void
cfs_node_to_cpumask(int node, cpumask_t *mask)
{
const cpumask_t *tmp = cpumask_of_node(node);
if (tmp)
cpumask_copy(mask, tmp);
else
cpumask_clear(mask);
}
void void
cfs_cpt_table_free(struct cfs_cpt_table *cptab) cfs_cpt_table_free(struct cfs_cpt_table *cptab)
{ {
...@@ -403,7 +414,7 @@ cfs_cpt_set_node(struct cfs_cpt_table *cptab, int cpt, int node) ...@@ -403,7 +414,7 @@ cfs_cpt_set_node(struct cfs_cpt_table *cptab, int cpt, int node)
mutex_lock(&cpt_data.cpt_mutex); mutex_lock(&cpt_data.cpt_mutex);
mask = cpt_data.cpt_cpumask; mask = cpt_data.cpt_cpumask;
cpumask_copy(mask, cpumask_of_node(node)); cfs_node_to_cpumask(node, mask);
rc = cfs_cpt_set_cpumask(cptab, cpt, mask); rc = cfs_cpt_set_cpumask(cptab, cpt, mask);
...@@ -427,7 +438,7 @@ cfs_cpt_unset_node(struct cfs_cpt_table *cptab, int cpt, int node) ...@@ -427,7 +438,7 @@ cfs_cpt_unset_node(struct cfs_cpt_table *cptab, int cpt, int node)
mutex_lock(&cpt_data.cpt_mutex); mutex_lock(&cpt_data.cpt_mutex);
mask = cpt_data.cpt_cpumask; mask = cpt_data.cpt_cpumask;
cpumask_copy(mask, cpumask_of_node(node)); cfs_node_to_cpumask(node, mask);
cfs_cpt_unset_cpumask(cptab, cpt, mask); cfs_cpt_unset_cpumask(cptab, cpt, mask);
...@@ -749,7 +760,7 @@ cfs_cpt_table_create(int ncpt) ...@@ -749,7 +760,7 @@ cfs_cpt_table_create(int ncpt)
} }
for_each_online_node(i) { for_each_online_node(i) {
cpumask_copy(mask, cpumask_of_node(i)); cfs_node_to_cpumask(i, mask);
while (!cpumask_empty(mask)) { while (!cpumask_empty(mask)) {
struct cfs_cpu_partition *part; struct cfs_cpu_partition *part;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment