Skip to content

Commit 493afbd

Browse files
kudureranganathPeter Zijlstra
authored andcommitted
sched/fair: Fix NEXT_BUDDY
Adam reports that enabling NEXT_BUDDY insta triggers a WARN in pick_next_entity(). Moving clear_buddies() up before the delayed dequeue bits ensures no ->next buddy becomes delayed. Further ensure no new ->next buddy ever starts as delayed. Fixes: 152e11f ("sched/fair: Implement delayed dequeue") Reported-by: Adam Li <adamli@os.amperecomputing.com> Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Adam Li <adamli@os.amperecomputing.com> Link: https://lkml.kernel.org/r/670a0d54-e398-4b1f-8a6e-90784e2fdf89@amd.com
1 parent 82f9cc0 commit 493afbd

File tree

1 file changed

+2
-5
lines changed

1 file changed

+2
-5
lines changed

kernel/sched/fair.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5478,6 +5478,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
54785478
bool sleep = flags & DEQUEUE_SLEEP;
54795479

54805480
update_curr(cfs_rq);
5481+
clear_buddies(cfs_rq, se);
54815482

54825483
if (flags & DEQUEUE_DELAYED) {
54835484
SCHED_WARN_ON(!se->sched_delayed);
@@ -5494,8 +5495,6 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
54945495

54955496
if (sched_feat(DELAY_DEQUEUE) && delay &&
54965497
!entity_eligible(cfs_rq, se)) {
5497-
if (cfs_rq->next == se)
5498-
cfs_rq->next = NULL;
54995498
update_load_avg(cfs_rq, se, 0);
55005499
se->sched_delayed = 1;
55015500
return false;
@@ -5520,8 +5519,6 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
55205519

55215520
update_stats_dequeue_fair(cfs_rq, se, flags);
55225521

5523-
clear_buddies(cfs_rq, se);
5524-
55255522
update_entity_lag(cfs_rq, se);
55265523
if (sched_feat(PLACE_REL_DEADLINE) && !sleep) {
55275524
se->deadline -= se->vruntime;
@@ -8774,7 +8771,7 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int
87748771
if (unlikely(throttled_hierarchy(cfs_rq_of(pse))))
87758772
return;
87768773

8777-
if (sched_feat(NEXT_BUDDY) && !(wake_flags & WF_FORK)) {
8774+
if (sched_feat(NEXT_BUDDY) && !(wake_flags & WF_FORK) && !pse->sched_delayed) {
87788775
set_next_buddy(pse);
87798776
}
87808777

0 commit comments

Comments
 (0)