diff options
author | Gregory Haskins <ghaskins@novell.com> | 2008-05-12 21:21:14 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-06 15:19:29 +0200 |
commit | 6d299f1b53b84e2665f402d9bcc494800aba6386 (patch) | |
tree | 52d44fb6e2fe84f180c7e47a0faa5da48be6ab26 /kernel/sched_fair.c | |
parent | 6e0534f278199f1e3dd1049b9bc19a7a5b87ada1 (diff) | |
download | linux-6d299f1b53b84e2665f402d9bcc494800aba6386.tar.gz linux-6d299f1b53b84e2665f402d9bcc494800aba6386.tar.bz2 linux-6d299f1b53b84e2665f402d9bcc494800aba6386.zip |
sched: fix SCHED_OTHER balance iterator to include all tasks
The currently logic inadvertently skips the last task on the run-queue,
resulting in missed balance opportunities.
Signed-off-by: Gregory Haskins <ghaskins@novell.com>
Signed-off-by: David Bahi <dbahi@novell.com>
CC: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r-- | kernel/sched_fair.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 08ae848b71d4..1fe4c65a8170 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c @@ -1275,23 +1275,18 @@ __load_balance_iterator(struct cfs_rq *cfs_rq, struct list_head *next) struct task_struct *p = NULL; struct sched_entity *se; - if (next == &cfs_rq->tasks) - return NULL; - - /* Skip over entities that are not tasks */ - do { + while (next != &cfs_rq->tasks) { se = list_entry(next, struct sched_entity, group_node); next = next->next; - } while (next != &cfs_rq->tasks && !entity_is_task(se)); - if (next == &cfs_rq->tasks) - return NULL; + /* Skip over entities that are not tasks */ + if (entity_is_task(se)) { + p = task_of(se); + break; + } + } cfs_rq->balance_iterator = next; - - if (entity_is_task(se)) - p = task_of(se); - return p; } |