diff options
-rw-r--r-- | kernel/sched/fair.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index c11e36ff5ea0..201be782b5b3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -1000,7 +1000,7 @@ struct numa_stats { | |||
1000 | */ | 1000 | */ |
1001 | static void update_numa_stats(struct numa_stats *ns, int nid) | 1001 | static void update_numa_stats(struct numa_stats *ns, int nid) |
1002 | { | 1002 | { |
1003 | int cpu; | 1003 | int cpu, cpus = 0; |
1004 | 1004 | ||
1005 | memset(ns, 0, sizeof(*ns)); | 1005 | memset(ns, 0, sizeof(*ns)); |
1006 | for_each_cpu(cpu, cpumask_of_node(nid)) { | 1006 | for_each_cpu(cpu, cpumask_of_node(nid)) { |
@@ -1009,8 +1009,21 @@ static void update_numa_stats(struct numa_stats *ns, int nid) | |||
1009 | ns->nr_running += rq->nr_running; | 1009 | ns->nr_running += rq->nr_running; |
1010 | ns->load += weighted_cpuload(cpu); | 1010 | ns->load += weighted_cpuload(cpu); |
1011 | ns->power += power_of(cpu); | 1011 | ns->power += power_of(cpu); |
1012 | |||
1013 | cpus++; | ||
1012 | } | 1014 | } |
1013 | 1015 | ||
1016 | /* | ||
1017 | * If we raced with hotplug and there are no CPUs left in our mask | ||
1018 | * the @ns structure is NULL'ed and task_numa_compare() will | ||
1019 | * not find this node attractive. | ||
1020 | * | ||
1021 | * We'll either bail at !has_capacity, or we'll detect a huge imbalance | ||
1022 | * and bail there. | ||
1023 | */ | ||
1024 | if (!cpus) | ||
1025 | return; | ||
1026 | |||
1014 | ns->load = (ns->load * SCHED_POWER_SCALE) / ns->power; | 1027 | ns->load = (ns->load * SCHED_POWER_SCALE) / ns->power; |
1015 | ns->capacity = DIV_ROUND_CLOSEST(ns->power, SCHED_POWER_SCALE); | 1028 | ns->capacity = DIV_ROUND_CLOSEST(ns->power, SCHED_POWER_SCALE); |
1016 | ns->has_capacity = (ns->nr_running < ns->capacity); | 1029 | ns->has_capacity = (ns->nr_running < ns->capacity); |