mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
sched/deadline: Fix server stopping with runnable tasks
The deadline server can currently stop due to idle although fair tasks
are runnable. This happens essentially when:
* the server is set to idle, a task wakes up, the server stops
* a task wakes up, the server sets itself to idle and stops right away
Address both cases by clearing the server idle flag whenever a fair task
wakes up and accounting also for pending tasks in the definition of idle.
Fixes: f5a538c07d ("sched/deadline: Fix dl_server stop condition")
Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20260113085159.114226-3-gmonaco@redhat.com
This commit is contained in:
parent
1e0a2ba7af
commit
ca1e8eede4
|
|
@ -1420,7 +1420,7 @@ update_stats_dequeue_dl(struct dl_rq *dl_rq, struct sched_dl_entity *dl_se, int
|
|||
|
||||
static void update_curr_dl_se(struct rq *rq, struct sched_dl_entity *dl_se, s64 delta_exec)
|
||||
{
|
||||
bool idle = rq->curr == rq->idle;
|
||||
bool idle = idle_rq(rq);
|
||||
s64 scaled_delta_exec;
|
||||
|
||||
if (unlikely(delta_exec <= 0)) {
|
||||
|
|
@ -1603,8 +1603,8 @@ void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec)
|
|||
* | 8 | B:zero_laxity-wait | | |
|
||||
* | | | <---+ |
|
||||
* | +--------------------------------+ |
|
||||
* | | ^ ^ 2 |
|
||||
* | | 7 | 2 +--------------------+
|
||||
* | | ^ ^ 2 |
|
||||
* | | 7 | 2, 1 +----------------+
|
||||
* | v |
|
||||
* | +-------------+ |
|
||||
* +-- | C:idle-wait | -+
|
||||
|
|
@ -1649,8 +1649,11 @@ void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec)
|
|||
* dl_defer_idle = 0
|
||||
*
|
||||
*
|
||||
* [1] A->B, A->D
|
||||
* [1] A->B, A->D, C->B
|
||||
* dl_server_start()
|
||||
* dl_defer_idle = 0;
|
||||
* if (dl_server_active)
|
||||
* return; // [B]
|
||||
* dl_server_active = 1;
|
||||
* enqueue_dl_entity()
|
||||
* update_dl_entity(WAKEUP)
|
||||
|
|
@ -1759,6 +1762,7 @@ void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec)
|
|||
* "B:zero_laxity-wait" -> "C:idle-wait" [label="7:dl_server_update_idle"]
|
||||
* "B:zero_laxity-wait" -> "D:running" [label="3:dl_server_timer"]
|
||||
* "C:idle-wait" -> "A:init" [label="8:dl_server_timer"]
|
||||
* "C:idle-wait" -> "B:zero_laxity-wait" [label="1:dl_server_start"]
|
||||
* "C:idle-wait" -> "B:zero_laxity-wait" [label="2:dl_server_update"]
|
||||
* "C:idle-wait" -> "C:idle-wait" [label="7:dl_server_update_idle"]
|
||||
* "D:running" -> "A:init" [label="4:pick_task_dl"]
|
||||
|
|
@ -1784,6 +1788,7 @@ void dl_server_start(struct sched_dl_entity *dl_se)
|
|||
{
|
||||
struct rq *rq = dl_se->rq;
|
||||
|
||||
dl_se->dl_defer_idle = 0;
|
||||
if (!dl_server(dl_se) || dl_se->dl_server_active)
|
||||
return;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user