From 4c963a2ab19b766a4ba3c2b396b4e3537c423b0c Mon Sep 17 00:00:00 2001 From: "Siddha, Suresh B" Date: Sat, 10 Sep 2005 00:26:21 -0700 Subject: [PATCH] --- yaml --- r: 8356 b: refs/heads/master c: 0c117f1b4d14380baeed9c883f765ee023da8761 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/sched.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 1cf99b6fafd8..f2b3500b3308 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fa3b6ddc3f4a8eadba52234134cdb59c28b5332d +refs/heads/master: 0c117f1b4d14380baeed9c883f765ee023da8761 diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 1dc29dec38a9..dbd4490afec1 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -1910,6 +1910,7 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, { struct sched_group *busiest = NULL, *this = NULL, *group = sd->groups; unsigned long max_load, avg_load, total_load, this_load, total_pwr; + unsigned long max_pull; int load_idx; max_load = this_load = total_load = total_pwr = 0; @@ -1959,7 +1960,7 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, group = group->next; } while (group != sd->groups); - if (!busiest || this_load >= max_load) + if (!busiest || this_load >= max_load || max_load <= SCHED_LOAD_SCALE) goto out_balanced; avg_load = (SCHED_LOAD_SCALE * total_load) / total_pwr; @@ -1979,8 +1980,12 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, * by pulling tasks to us. Be careful of negative numbers as they'll * appear as very large values with unsigned longs. */ + + /* Don't want to pull so many tasks that a group would go idle */ + max_pull = min(max_load - avg_load, max_load - SCHED_LOAD_SCALE); + /* How much load to actually move to equalise the imbalance */ - *imbalance = min((max_load - avg_load) * busiest->cpu_power, + *imbalance = min(max_pull * busiest->cpu_power, (avg_load - this_load) * this->cpu_power) / SCHED_LOAD_SCALE;