Commit 067e0480 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] sched: improved resolution in find_busiest_node

From: Nick Piggin <piggin@cyberone.com.au>

From: Frank Cornelis <frank.cornelis@elis.ugent.be>

In order to get the best possible resolution we need to use NR_CPUS instead
of the constant value 10.  load is an int, so no need to worry about
overflows...
parent 4f20771c
...@@ -1104,7 +1104,7 @@ void sched_balance_exec(void) ...@@ -1104,7 +1104,7 @@ void sched_balance_exec(void)
* load_{t} = load_{t-1}/2 + nr_node_running_{t} * load_{t} = load_{t-1}/2 + nr_node_running_{t}
* This way sudden load peaks are flattened out a bit. * This way sudden load peaks are flattened out a bit.
* Node load is divided by nr_cpus_node() in order to compare nodes * Node load is divided by nr_cpus_node() in order to compare nodes
* of different cpu count but also [first] multiplied by 10 to * of different cpu count but also [first] multiplied by NR_CPUS to
* provide better resolution. * provide better resolution.
*/ */
static int find_busiest_node(int this_node) static int find_busiest_node(int this_node)
...@@ -1114,14 +1114,14 @@ static int find_busiest_node(int this_node) ...@@ -1114,14 +1114,14 @@ static int find_busiest_node(int this_node)
if (!nr_cpus_node(this_node)) if (!nr_cpus_node(this_node))
return node; return node;
this_load = maxload = (this_rq()->prev_node_load[this_node] >> 1) this_load = maxload = (this_rq()->prev_node_load[this_node] >> 1)
+ (10 * atomic_read(&node_nr_running[this_node]) + (NR_CPUS * atomic_read(&node_nr_running[this_node])
/ nr_cpus_node(this_node)); / nr_cpus_node(this_node));
this_rq()->prev_node_load[this_node] = this_load; this_rq()->prev_node_load[this_node] = this_load;
for_each_node_with_cpus(i) { for_each_node_with_cpus(i) {
if (i == this_node) if (i == this_node)
continue; continue;
load = (this_rq()->prev_node_load[i] >> 1) load = (this_rq()->prev_node_load[i] >> 1)
+ (10 * atomic_read(&node_nr_running[i]) + (NR_CPUS * atomic_read(&node_nr_running[i])
/ nr_cpus_node(i)); / nr_cpus_node(i));
this_rq()->prev_node_load[i] = load; this_rq()->prev_node_load[i] = load;
if (load > maxload && (100*load > NODE_THRESHOLD*this_load)) { if (load > maxload && (100*load > NODE_THRESHOLD*this_load)) {
......
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