Merge tag 'sched_urgent_for_v6.17_rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull scheduler fixes from Borislav Petkov:

- Fix a stall on the CPU offline path due to mis-counting a deadline
server task twice as part of the runqueue's running tasks count

- Fix a realtime tasks starvation case where failure to enqueue a timer
whose expiration time is already in the past would cause repeated
attempts to re-enqueue a deadline server task which leads to starving
the former, realtime one

- Prevent a delayed deadline server task stop from breaking the
per-runqueue bandwidth tracking

- Have a function checking whether the deadline server task has
stopped, return the correct value

* tag 'sched_urgent_for_v6.17_rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
sched/deadline: Don't count nr_running for dl_server proxy tasks
sched/deadline: Fix RT task potential starvation when expiry time passed
sched/deadline: Always stop dl-server before changing parameters
sched/deadline: Fix dl_server_stopped()

Changed files
+14 -10
kernel
+12 -6
kernel/sched/deadline.c
··· 1496 1496 } 1497 1497 1498 1498 if (unlikely(is_dl_boosted(dl_se) || !start_dl_timer(dl_se))) { 1499 - if (dl_server(dl_se)) 1500 - enqueue_dl_entity(dl_se, ENQUEUE_REPLENISH); 1501 - else 1499 + if (dl_server(dl_se)) { 1500 + replenish_dl_new_period(dl_se, rq); 1501 + start_dl_timer(dl_se); 1502 + } else { 1502 1503 enqueue_task_dl(rq, dl_task_of(dl_se), ENQUEUE_REPLENISH); 1504 + } 1503 1505 } 1504 1506 1505 1507 if (!is_leftmost(dl_se, &rq->dl)) ··· 1613 1611 static bool dl_server_stopped(struct sched_dl_entity *dl_se) 1614 1612 { 1615 1613 if (!dl_se->dl_server_active) 1616 - return false; 1614 + return true; 1617 1615 1618 1616 if (dl_se->dl_server_idle) { 1619 1617 dl_server_stop(dl_se); ··· 1851 1849 u64 deadline = dl_se->deadline; 1852 1850 1853 1851 dl_rq->dl_nr_running++; 1854 - add_nr_running(rq_of_dl_rq(dl_rq), 1); 1852 + 1853 + if (!dl_server(dl_se)) 1854 + add_nr_running(rq_of_dl_rq(dl_rq), 1); 1855 1855 1856 1856 inc_dl_deadline(dl_rq, deadline); 1857 1857 } ··· 1863 1859 { 1864 1860 WARN_ON(!dl_rq->dl_nr_running); 1865 1861 dl_rq->dl_nr_running--; 1866 - sub_nr_running(rq_of_dl_rq(dl_rq), 1); 1862 + 1863 + if (!dl_server(dl_se)) 1864 + sub_nr_running(rq_of_dl_rq(dl_rq), 1); 1867 1865 1868 1866 dec_dl_deadline(dl_rq, dl_se->deadline); 1869 1867 }
+2 -4
kernel/sched/debug.c
··· 376 376 return -EINVAL; 377 377 } 378 378 379 - if (rq->cfs.h_nr_queued) { 380 - update_rq_clock(rq); 381 - dl_server_stop(&rq->fair_server); 382 - } 379 + update_rq_clock(rq); 380 + dl_server_stop(&rq->fair_server); 383 381 384 382 retval = dl_server_apply_params(&rq->fair_server, runtime, period, 0); 385 383 if (retval)