From bebb781f8d8887c0ac80bc5200e19d30fe35d641 Mon Sep 17 00:00:00 2001 From: Mike Galbraith Date: Wed, 28 Jan 2009 14:51:39 +0100 Subject: [PATCH] --- yaml --- r: 130780 b: refs/heads/master c: a9f3e2b549f83a9cdab873abf4140be27c05a3f2 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/sched_fair.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index aeb6cd1d2255..32daa7997c85 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1596e29773eadd96b0a5fc6e736afa52394cafda +refs/heads/master: a9f3e2b549f83a9cdab873abf4140be27c05a3f2 diff --git a/trunk/kernel/sched_fair.c b/trunk/kernel/sched_fair.c index fdc417504681..75248b9ff4c1 100644 --- a/trunk/kernel/sched_fair.c +++ b/trunk/kernel/sched_fair.c @@ -768,8 +768,14 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) ideal_runtime = sched_slice(cfs_rq, curr); delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; - if (delta_exec > ideal_runtime) + if (delta_exec > ideal_runtime) { resched_task(rq_of(cfs_rq)->curr); + /* + * The current task ran long enough, ensure it doesn't get + * re-elected due to buddy favours. + */ + clear_buddies(cfs_rq, curr); + } } static void @@ -1445,6 +1451,11 @@ static struct task_struct *pick_next_task_fair(struct rq *rq) do { se = pick_next_entity(cfs_rq); + /* + * If se was a buddy, clear it so that it will have to earn + * the favour again. + */ + clear_buddies(cfs_rq, se); set_next_entity(cfs_rq, se); cfs_rq = group_cfs_rq(se); } while (cfs_rq);