From bdcff9f34ca165cae547cefd133fa5d517757f93 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 17 Sep 2009 09:01:20 +0200 Subject: [PATCH] --- yaml --- r: 163025 b: refs/heads/master c: de69a80be32445b0a71e8e3b757e584d7beb90f7 h: refs/heads/master i: 163023: 4c2008ecc01b3029d87eae6556f91409912a7921 v: v3 --- [refs] | 2 +- trunk/kernel/sched_fair.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index bd24d05ea27d..be097b58c21c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ad4b78bbcbab66998b05d422ac6106b645796e54 +refs/heads/master: de69a80be32445b0a71e8e3b757e584d7beb90f7 diff --git a/trunk/kernel/sched_fair.c b/trunk/kernel/sched_fair.c index 3e6f78c66876..ffee827fa22f 100644 --- a/trunk/kernel/sched_fair.c +++ b/trunk/kernel/sched_fair.c @@ -764,10 +764,10 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup) static void __clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se) { - if (cfs_rq->last == se) + if (!se || cfs_rq->last == se) cfs_rq->last = NULL; - if (cfs_rq->next == se) + if (!se || cfs_rq->next == se) cfs_rq->next = NULL; } @@ -1646,8 +1646,13 @@ static struct task_struct *pick_next_task_fair(struct rq *rq) /* * If se was a buddy, clear it so that it will have to earn * the favour again. + * + * If se was not a buddy, clear the buddies because neither + * was elegible to run, let them earn it again. + * + * IOW. unconditionally clear buddies. */ - __clear_buddies(cfs_rq, se); + __clear_buddies(cfs_rq, NULL); set_next_entity(cfs_rq, se); cfs_rq = group_cfs_rq(se); } while (cfs_rq);