Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=aeb73b040399f94698b4f64dd058cae39187e18d
Commit:     aeb73b040399f94698b4f64dd058cae39187e18d
Parent:     2e09bf556fbe1a4cd8d837a3e6607de55f7cf4fd
Author:     Peter Zijlstra <[EMAIL PROTECTED]>
AuthorDate: Mon Oct 15 17:00:05 2007 +0200
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Mon Oct 15 17:00:05 2007 +0200

    sched: clean up new task placement
    
    clean up new task placement.
    
    Signed-off-by: Peter Zijlstra <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Mike Galbraith <[EMAIL PROTECTED]>
---
 kernel/sched_fair.c |   57 +++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index a60b1da..cc447fb 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -199,6 +199,21 @@ static struct sched_entity *__pick_next_entity(struct 
cfs_rq *cfs_rq)
        return rb_entry(first_fair(cfs_rq), struct sched_entity, run_node);
 }
 
+static inline struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq)
+{
+       struct rb_node **link = &cfs_rq->tasks_timeline.rb_node;
+       struct sched_entity *se = NULL;
+       struct rb_node *parent;
+
+       while (*link) {
+               parent = *link;
+               se = rb_entry(parent, struct sched_entity, run_node);
+               link = &parent->rb_right;
+       }
+
+       return se;
+}
+
 /**************************************************************
  * Scheduling class statistics methods:
  */
@@ -530,6 +545,31 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct 
sched_entity *se)
 }
 
 static void
+place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
+{
+       struct sched_entity *last = __pick_last_entity(cfs_rq);
+       u64 min_runtime, latency;
+
+       min_runtime = cfs_rq->min_vruntime;
+       if (last) {
+               min_runtime += last->vruntime;
+               min_runtime >>= 1;
+               if (initial && sched_feat(START_DEBIT))
+                       min_runtime += sysctl_sched_latency/2;
+       }
+
+       if (!initial && sched_feat(NEW_FAIR_SLEEPERS)) {
+               latency = sysctl_sched_latency;
+               if (min_runtime > latency)
+                       min_runtime -= latency;
+               else
+                       min_runtime = 0;
+       }
+
+       se->vruntime = max(se->vruntime, min_runtime);
+}
+
+static void
 enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
 {
        /*
@@ -538,19 +578,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity 
*se, int wakeup)
        update_curr(cfs_rq);
 
        if (wakeup) {
-               u64 min_runtime, latency;
-
-               min_runtime = cfs_rq->min_vruntime;
-               min_runtime += sysctl_sched_latency/2;
-
-               if (sched_feat(NEW_FAIR_SLEEPERS)) {
-                       latency = calc_weighted(sysctl_sched_latency, se);
-                       if (min_runtime > latency)
-                               min_runtime -= latency;
-               }
-
-               se->vruntime = max(se->vruntime, min_runtime);
-
+               place_entity(cfs_rq, se, 0);
                enqueue_sleeper(cfs_rq, se);
        }
 
@@ -1033,8 +1061,7 @@ static void task_new_fair(struct rq *rq, struct 
task_struct *p)
        sched_info_queued(p);
 
        update_curr(cfs_rq);
-       se->vruntime = cfs_rq->min_vruntime;
-       update_stats_enqueue(cfs_rq, se);
+       place_entity(cfs_rq, se, 1);
 
        /*
         * The first wait is dominated by the child-runs-first logic,
-
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