diff --git a/[refs] b/[refs] index 187b66310bf5..b619495b06e7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 94dfb5e75ef59068a8cf68fa6e18f25ebdcd20b9 +refs/heads/master: 9014623c0e3545be58a7f19f55793f6517bdc274 diff --git a/trunk/kernel/sched_fair.c b/trunk/kernel/sched_fair.c index 86e5e8c5d101..895fef74d99a 100644 --- a/trunk/kernel/sched_fair.c +++ b/trunk/kernel/sched_fair.c @@ -124,11 +124,18 @@ set_leftmost(struct cfs_rq *cfs_rq, struct rb_node *leftmost) cfs_rq->rb_leftmost = leftmost; if (leftmost) { se = rb_entry(leftmost, struct sched_entity, run_node); - cfs_rq->min_vruntime = max(se->vruntime, - cfs_rq->min_vruntime); + if ((se->vruntime > cfs_rq->min_vruntime) || + (cfs_rq->min_vruntime > (1ULL << 61) && + se->vruntime < (1ULL << 50))) + cfs_rq->min_vruntime = se->vruntime; } } +s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se) +{ + return se->fair_key - cfs_rq->min_vruntime; +} + /* * Enqueue an entity into the rb-tree: */ @@ -138,7 +145,7 @@ __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) struct rb_node **link = &cfs_rq->tasks_timeline.rb_node; struct rb_node *parent = NULL; struct sched_entity *entry; - s64 key = se->fair_key; + s64 key = entity_key(cfs_rq, se); int leftmost = 1; /* @@ -151,7 +158,7 @@ __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) * We dont care about collisions. Nodes with * the same key stay together. */ - if (key - entry->fair_key < 0) { + if (key < entity_key(cfs_rq, entry)) { link = &parent->rb_left; } else { link = &parent->rb_right;