Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=08ec3df5109e0555da5b9deb4382fd29733c852c
Commit:     08ec3df5109e0555da5b9deb4382fd29733c852c
Parent:     647e7cac2d215fb8890f79252d7eaee3d6743d66
Author:     Dmitry Adamushko <[EMAIL PROTECTED]>
AuthorDate: Mon Oct 15 17:00:13 2007 +0200
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Mon Oct 15 17:00:13 2007 +0200

    sched: fix __pick_next_entity()
    
    The thing is that __pick_next_entity() must never be called when
    first_fair(cfs_rq) == NULL. It wouldn't be a problem, should 'run_node'
    be the very first field of 'struct sched_entity' (and it's the second).
    
    The 'nr_running != 0' check is _not_ enough, due to the fact that
    'current' is not within the tree. Generic paths are ok (e.g. schedule()
    as put_prev_task() is called previously)... I'm more worried about e.g.
    migration_call() -> CPU_DEAD_FROZEN -> migrate_dead_tasks()... if
    'current' == rq->idle, no problems.. if it's one of the SCHED_NORMAL
    tasks (or imagine, some other use-cases in the future -- i.e. we should
    not make outer world dependent on internal details of sched_fair class)
    -- it may be "Houston, we've got a problem" case.
    
    it's +16 bytes to the ".text". Another variant is to make 'run_node' the
    first data member of 'struct sched_entity' but an additional check (se !
    = NULL) is still needed in pick_next_entity().
    
    Signed-off-by: Dmitry Adamushko <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Reviewed-by: Thomas Gleixner <[EMAIL PROTECTED]>
---
 kernel/sched_fair.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 1f14b56..fa78686 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -600,9 +600,12 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity 
*se)
 
 static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq)
 {
-       struct sched_entity *se = __pick_next_entity(cfs_rq);
+       struct sched_entity *se = NULL;
 
-       set_next_entity(cfs_rq, se);
+       if (first_fair(cfs_rq)) {
+               se = __pick_next_entity(cfs_rq);
+               set_next_entity(cfs_rq, se);
+       }
 
        return se;
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to