Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 3298
b: refs/heads/master
c: 3dbd534
h: refs/heads/master
v: v3
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Jun 25, 2005
1 parent b072778 commit 4f51ed1
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 8 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: 245af2c7870bd5940f7bfad19a0a03b32751fbc5
refs/heads/master: 3dbd5342074a1e570ec84edf859deb9be588006d
45 changes: 38 additions & 7 deletions trunk/kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1319,21 +1319,24 @@ void fastcall wake_up_new_task(task_t * p, unsigned long clone_flags)
sd = tmp;

if (sd) {
cpumask_t span;
int new_cpu;
struct sched_group *group;

again:
schedstat_inc(sd, sbf_cnt);
span = sd->span;
cpu = task_cpu(p);
group = find_idlest_group(sd, p, cpu);
if (!group) {
schedstat_inc(sd, sbf_balanced);
goto no_forkbalance;
goto nextlevel;
}

new_cpu = find_idlest_cpu(group, cpu);
if (new_cpu == -1 || new_cpu == cpu) {
schedstat_inc(sd, sbf_balanced);
goto no_forkbalance;
goto nextlevel;
}

if (cpu_isset(new_cpu, p->cpus_allowed)) {
Expand All @@ -1343,9 +1346,21 @@ void fastcall wake_up_new_task(task_t * p, unsigned long clone_flags)
rq = task_rq_lock(p, &flags);
cpu = task_cpu(p);
}

/* Now try balancing at a lower domain level */
nextlevel:
sd = NULL;
for_each_domain(cpu, tmp) {
if (cpus_subset(span, tmp->span))
break;
if (tmp->flags & SD_BALANCE_FORK)
sd = tmp;
}

if (sd)
goto again;
}

no_forkbalance:
#endif
/*
* We decrease the sleep average of forking parents
Expand Down Expand Up @@ -1711,25 +1726,41 @@ void sched_exec(void)
sd = tmp;

if (sd) {
cpumask_t span;
struct sched_group *group;
again:
schedstat_inc(sd, sbe_cnt);
span = sd->span;
group = find_idlest_group(sd, current, this_cpu);
if (!group) {
schedstat_inc(sd, sbe_balanced);
goto out;
goto nextlevel;
}
new_cpu = find_idlest_cpu(group, this_cpu);
if (new_cpu == -1 || new_cpu == this_cpu) {
schedstat_inc(sd, sbe_balanced);
goto out;
goto nextlevel;
}

schedstat_inc(sd, sbe_pushed);
put_cpu();
sched_migrate_task(current, new_cpu);
return;

/* Now try balancing at a lower domain level */
this_cpu = get_cpu();
nextlevel:
sd = NULL;
for_each_domain(this_cpu, tmp) {
if (cpus_subset(span, tmp->span))
break;
if (tmp->flags & SD_BALANCE_EXEC)
sd = tmp;
}

if (sd)
goto again;
}
out:

put_cpu();
}

Expand Down

0 comments on commit 4f51ed1

Please sign in to comment.