diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2008-03-14 21:12:12 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-03-15 03:02:50 +0100 |
commit | aa2ac25229cd4d0280f6174c42712744ad61b140 (patch) | |
tree | e4450de1bb2cd4cd56d6abf64feb862c1d542653 /kernel/sched.c | |
parent | sched: fix calc_delta_mine() (diff) | |
download | linux-aa2ac25229cd4d0280f6174c42712744ad61b140.tar.xz linux-aa2ac25229cd4d0280f6174c42712744ad61b140.zip |
sched: fix overload performance: buddy wakeups
Currently we schedule to the leftmost task in the runqueue. When the
runtimes are very short because of some server/client ping-pong,
especially in over-saturated workloads, this will cycle through all
tasks trashing the cache.
Reduce cache trashing by keeping dependent tasks together by running
newly woken tasks first. However, by not running the leftmost task first
we could starve tasks because the wakee can gain unlimited runtime.
Therefore we only run the wakee if its within a small
(wakeup_granularity) window of the leftmost task. This preserves
fairness, but does alternate server/client task groups.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 6b06f23261c0..d1ad69b270ca 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -301,7 +301,7 @@ struct cfs_rq { /* 'curr' points to currently running entity on this cfs_rq. * It is set to NULL otherwise (i.e when none are currently running). */ - struct sched_entity *curr; + struct sched_entity *curr, *next; unsigned long nr_spread_over; |