Messages in this thread Patch in this message | | | Subject | [patch] sched: ensure than a child can't start left of it's parent's vruntime at fork() time | From | Mike Galbraith <> | Date | Tue, 08 Sep 2009 13:16:17 +0200 |
| |
sched: ensure than a child can't start left of it's parent's vruntime at fork() time.
With START_DEBIT we make room for the new task, but with child_runs_first, the debit lands on the parent when we swap vruntimes. There's nothing to prevent the parent's vruntime having been right of min_vruntime at fork() time, meaning that the child can gain vruntime, thus increasing scheduling latency for waiters.
Signed-off-by: Mike Galbraith <efault@gmx.de> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <new-submission>
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index cc97ea4..eb1269c 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c @@ -728,11 +728,11 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) vruntime -= thresh; } - - /* ensure we never gain time by being placed backwards. */ - vruntime = max_vruntime(se->vruntime, vruntime); } + /* ensure we never gain time by being placed backwards. */ + vruntime = max_vruntime(se->vruntime, vruntime); + se->vruntime = vruntime; } @@ -1756,6 +1757,8 @@ static void task_new_fair(struct rq *rq, struct task_struct *p) sched_info_queued(p); update_curr(cfs_rq); + if (curr) + se->vruntime = curr->vruntime; place_entity(cfs_rq, se, 1); /* 'curr' will be NULL if the child belongs to a different group */
| |