Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 158370
b: refs/heads/master
c: bdb94aa
h: refs/heads/master
v: v3
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Sep 4, 2009
1 parent 5fa7f32 commit 20ed5d7
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e9e9250bc78e7f6342517214c0178a529807964b
refs/heads/master: bdb94aa5dbd8b55e75f5a50b61312fe589e2c2d1
33 changes: 28 additions & 5 deletions trunk/kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -3908,8 +3908,8 @@ static inline void update_sg_lb_stats(struct sched_domain *sd,
if ((max_cpu_load - min_cpu_load) > 2*avg_load_per_task)
sgs->group_imb = 1;

sgs->group_capacity = group->__cpu_power / SCHED_LOAD_SCALE;

sgs->group_capacity =
DIV_ROUND_CLOSEST(group->__cpu_power, SCHED_LOAD_SCALE);
}

/**
Expand Down Expand Up @@ -3959,7 +3959,7 @@ static inline void update_sd_lb_stats(struct sched_domain *sd, int this_cpu,
* and move all the excess tasks away.
*/
if (prefer_sibling)
sgs.group_capacity = 1;
sgs.group_capacity = min(sgs.group_capacity, 1UL);

if (local_group) {
sds->this_load = sgs.avg_load;
Expand Down Expand Up @@ -4191,6 +4191,26 @@ find_busiest_group(struct sched_domain *sd, int this_cpu,
return NULL;
}

static struct sched_group *group_of(int cpu)
{
struct sched_domain *sd = rcu_dereference(cpu_rq(cpu)->sd);

if (!sd)
return NULL;

return sd->groups;
}

static unsigned long power_of(int cpu)
{
struct sched_group *group = group_of(cpu);

if (!group)
return SCHED_LOAD_SCALE;

return group->__cpu_power;
}

/*
* find_busiest_queue - find the busiest runqueue among the cpus in group.
*/
Expand All @@ -4203,15 +4223,18 @@ find_busiest_queue(struct sched_group *group, enum cpu_idle_type idle,
int i;

for_each_cpu(i, sched_group_cpus(group)) {
unsigned long power = power_of(i);
unsigned long capacity = DIV_ROUND_CLOSEST(power, SCHED_LOAD_SCALE);
unsigned long wl;

if (!cpumask_test_cpu(i, cpus))
continue;

rq = cpu_rq(i);
wl = weighted_cpuload(i);
wl = weighted_cpuload(i) * SCHED_LOAD_SCALE;
wl /= power;

if (rq->nr_running == 1 && wl > imbalance)
if (capacity && rq->nr_running == 1 && wl > imbalance)
continue;

if (wl > max_load) {
Expand Down

0 comments on commit 20ed5d7

Please sign in to comment.