diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 90d7f8346d71..976cc3ca72a7 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -9757,6 +9757,15 @@ static inline bool set_preempt_buddy(struct cfs_rq *cfs_rq, struct sched_entity return true; } +static inline bool set_short_buddy(struct cfs_rq *cfs_rq, struct sched_entity *pse) +{ + if (cfs_rq->next && cfs_rq->next->slice < pse->slice) + return false; + + set_next_buddy(cfs_rq, pse); + return true; +} + /* * WF_SYNC|WF_TTWU indicates the waker expects to sleep but it is not * strictly enforced because the hint is either misunderstood or @@ -9931,7 +9940,7 @@ static void wakeup_preempt_fair(struct rq *rq, struct task_struct *p, int wake_f preempt: if (preempt_action == PREEMPT_WAKEUP_SHORT) { cancel_protect_slice(se); - clear_buddies(cfs_rq, se); + set_short_buddy(cfs_rq, pse); } resched_curr_lazy(rq);