|
@@ -4968,7 +4968,7 @@ static struct rq *find_busiest_queue(struct lb_env *env,
|
|
|
struct sched_group *group)
|
|
|
{
|
|
|
struct rq *busiest = NULL, *rq;
|
|
|
- unsigned long max_load = 0;
|
|
|
+ unsigned long busiest_load = 0, busiest_power = 1;
|
|
|
int i;
|
|
|
|
|
|
for_each_cpu(i, sched_group_cpus(group)) {
|
|
@@ -4998,11 +4998,15 @@ static struct rq *find_busiest_queue(struct lb_env *env,
|
|
|
* the weighted_cpuload() scaled with the cpu power, so that
|
|
|
* the load can be moved away from the cpu that is potentially
|
|
|
* running at a lower capacity.
|
|
|
+ *
|
|
|
+ * Thus we're looking for max(wl_i / power_i), crosswise
|
|
|
+ * multiplication to rid ourselves of the division works out
|
|
|
+ * to: wl_i * power_j > wl_j * power_i; where j is our
|
|
|
+ * previous maximum.
|
|
|
*/
|
|
|
- wl = (wl * SCHED_POWER_SCALE) / power;
|
|
|
-
|
|
|
- if (wl > max_load) {
|
|
|
- max_load = wl;
|
|
|
+ if (wl * busiest_power > busiest_load * power) {
|
|
|
+ busiest_load = wl;
|
|
|
+ busiest_power = power;
|
|
|
busiest = rq;
|
|
|
}
|
|
|
}
|