Skip to content

Commit 9b5ce1a

Browse files
Mike GalbraithPeter Zijlstra
authored andcommitted
sched: Fix sched_delayed vs cfs_bandwidth
Meeting an unfinished DELAY_DEQUEUE treated entity in unthrottle_cfs_rq() leads to a couple terminal scenarios. Finish it first, so ENQUEUE_WAKEUP can proceed as it would have sans DELAY_DEQUEUE treatment. Fixes: 152e11f ("sched/fair: Implement delayed dequeue") Reported-by: Venkat Rao Bagalkote <[email protected]> Signed-off-by: Mike Galbraith <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Tested-by: Venkat Rao Bagalkote <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent e32cde8 commit 9b5ce1a

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

kernel/sched/fair.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6058,10 +6058,13 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
60586058
for_each_sched_entity(se) {
60596059
struct cfs_rq *qcfs_rq = cfs_rq_of(se);
60606060

6061-
if (se->on_rq) {
6062-
SCHED_WARN_ON(se->sched_delayed);
6061+
/* Handle any unfinished DELAY_DEQUEUE business first. */
6062+
if (se->sched_delayed) {
6063+
int flags = DEQUEUE_SLEEP | DEQUEUE_DELAYED;
6064+
6065+
dequeue_entity(qcfs_rq, se, flags);
6066+
} else if (se->on_rq)
60636067
break;
6064-
}
60656068
enqueue_entity(qcfs_rq, se, ENQUEUE_WAKEUP);
60666069

60676070
if (cfs_rq_is_idle(group_cfs_rq(se)))

0 commit comments

Comments
 (0)