Skip to content

Commit bf4d389

Browse files
committed
sched/core: Tweak wait_task_inactive() to force dequeue sched_delayed tasks
JIRA: https://issues.redhat.com/browse/RHEL-110301 commit b7ca574 Author: John Stultz <[email protected]> Date: Tue Apr 29 08:07:26 2025 -0700 sched/core: Tweak wait_task_inactive() to force dequeue sched_delayed tasks It was reported that in 6.12, smpboot_create_threads() was taking much longer then in 6.6. I narrowed down the call path to: smpboot_create_threads() -> kthread_create_on_cpu() -> kthread_bind() -> __kthread_bind_mask() ->wait_task_inactive() Where in wait_task_inactive() we were regularly hitting the queued case, which sets a 1 tick timeout, which when called multiple times in a row, accumulates quickly into a long delay. I noticed disabling the DELAY_DEQUEUE sched feature recovered the performance, and it seems the newly create tasks are usually sched_delayed and left on the runqueue. So in wait_task_inactive() when we see the task p->se.sched_delayed, manually dequeue the sched_delayed task with DEQUEUE_DELAYED, so we don't have to constantly wait a tick. Fixes: 152e11f ("sched/fair: Implement delayed dequeue") Reported-by: [email protected] Signed-off-by: John Stultz <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Tested-by: K Prateek Nayak <[email protected]> Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Phil Auld <[email protected]>
1 parent 3554f7f commit bf4d389

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

kernel/sched/core.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,6 +2256,12 @@ unsigned long wait_task_inactive(struct task_struct *p, unsigned int match_state
22562256
* just go back and repeat.
22572257
*/
22582258
rq = task_rq_lock(p, &rf);
2259+
/*
2260+
* If task is sched_delayed, force dequeue it, to avoid always
2261+
* hitting the tick timeout in the queued case
2262+
*/
2263+
if (p->se.sched_delayed)
2264+
dequeue_task(rq, p, DEQUEUE_SLEEP | DEQUEUE_DELAYED);
22592265
trace_sched_wait_task(p);
22602266
running = task_on_cpu(rq, p);
22612267
queued = task_on_rq_queued(p);

0 commit comments

Comments
 (0)