Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 69028
b: refs/heads/master
c: aeb73b0
h: refs/heads/master
v: v3
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Oct 15, 2007
1 parent 0fae0d9 commit cae44d4
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 16 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: 2e09bf556fbe1a4cd8d837a3e6607de55f7cf4fd
refs/heads/master: aeb73b040399f94698b4f64dd058cae39187e18d
57 changes: 42 additions & 15 deletions trunk/kernel/sched_fair.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
*/
Expand Down Expand Up @@ -529,6 +544,31 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
#endif
}

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)
{
Expand All @@ -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);
}

Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit cae44d4

Please sign in to comment.