diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched_fair.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 4e777b47eeda..c32c3e643daa 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -861,12 +861,21 @@ wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se); | |||
861 | static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) | 861 | static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) |
862 | { | 862 | { |
863 | struct sched_entity *se = __pick_next_entity(cfs_rq); | 863 | struct sched_entity *se = __pick_next_entity(cfs_rq); |
864 | struct sched_entity *buddy; | ||
864 | 865 | ||
865 | if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, se) < 1) | 866 | if (cfs_rq->next) { |
866 | return cfs_rq->next; | 867 | buddy = cfs_rq->next; |
868 | cfs_rq->next = NULL; | ||
869 | if (wakeup_preempt_entity(buddy, se) < 1) | ||
870 | return buddy; | ||
871 | } | ||
867 | 872 | ||
868 | if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, se) < 1) | 873 | if (cfs_rq->last) { |
869 | return cfs_rq->last; | 874 | buddy = cfs_rq->last; |
875 | cfs_rq->last = NULL; | ||
876 | if (wakeup_preempt_entity(buddy, se) < 1) | ||
877 | return buddy; | ||
878 | } | ||
870 | 879 | ||
871 | return se; | 880 | return se; |
872 | } | 881 | } |
@@ -1654,16 +1663,6 @@ static struct task_struct *pick_next_task_fair(struct rq *rq) | |||
1654 | 1663 | ||
1655 | do { | 1664 | do { |
1656 | se = pick_next_entity(cfs_rq); | 1665 | se = pick_next_entity(cfs_rq); |
1657 | /* | ||
1658 | * If se was a buddy, clear it so that it will have to earn | ||
1659 | * the favour again. | ||
1660 | * | ||
1661 | * If se was not a buddy, clear the buddies because neither | ||
1662 | * was elegible to run, let them earn it again. | ||
1663 | * | ||
1664 | * IOW. unconditionally clear buddies. | ||
1665 | */ | ||
1666 | __clear_buddies(cfs_rq, NULL); | ||
1667 | set_next_entity(cfs_rq, se); | 1666 | set_next_entity(cfs_rq, se); |
1668 | cfs_rq = group_cfs_rq(se); | 1667 | cfs_rq = group_cfs_rq(se); |
1669 | } while (cfs_rq); | 1668 | } while (cfs_rq); |