diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 8a8247b0654e..f79fcba4afec 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7903,8 +7903,6 @@ requeue_delayed_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) WARN_ON_ONCE(!se->sched_delayed); WARN_ON_ONCE(!se->on_rq); - update_curr(cfs_rq); - if (update_entity_lag(cfs_rq, se)) { cfs_rq->h_nr_queued--; if (se != cfs_rq->curr) @@ -7958,6 +7956,15 @@ static unsigned long enqueue_hierarchy(struct task_struct *p, int flags) return weight; } +/* Update curr's vruntime before placing entity or updating lag */ +static inline void update_curr_eevdf(struct cfs_rq *cfs_rq) +{ + if (!cfs_rq->curr) + return; + + update_curr(cfs_rq_of(cfs_rq->curr)); +} + /* * The enqueue_task method is called before nr_running is * increased. Here we update the fair scheduling stats and @@ -7985,6 +7992,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) if (!p->se.sched_delayed || (flags & ENQUEUE_DELAYED)) util_est_enqueue(cfs_rq, p); + update_curr_eevdf(cfs_rq); + if (flags & ENQUEUE_DELAYED) { requeue_delayed_entity(cfs_rq, se); return; @@ -8105,7 +8114,7 @@ static bool __dequeue_task(struct rq *rq, struct task_struct *p, int flags) clear_buddies(cfs_rq, se); - update_curr(cfs_rq_of(se)); + update_curr_eevdf(cfs_rq); update_entity_lag(cfs_rq, se); if (flags & DEQUEUE_DELAYED) {