linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] sched/ext: Fix invalid task state transitions on class switch
@ 2025-08-05  8:59 Andrea Righi
  2025-08-09 19:05 ` Tejun Heo
  0 siblings, 1 reply; 2+ messages in thread
From: Andrea Righi @ 2025-08-05  8:59 UTC (permalink / raw)
  To: Tejun Heo, David Vernet, Changwoo Min; +Cc: sched-ext, linux-kernel

When enabling a sched_ext scheduler, we may trigger invalid task state
transitions, resulting in warnings like the following (which can be
easily reproduced by running the hotplug selftest in a loop):

 sched_ext: Invalid task state transition 0 -> 3 for fish[770]
 WARNING: CPU: 18 PID: 787 at kernel/sched/ext.c:3862 scx_set_task_state+0x7c/0xc0
 ...
 RIP: 0010:scx_set_task_state+0x7c/0xc0
 ...
 Call Trace:
  <TASK>
  scx_enable_task+0x11f/0x2e0
  switching_to_scx+0x24/0x110
  scx_enable.isra.0+0xd14/0x13d0
  bpf_struct_ops_link_create+0x136/0x1a0
  __sys_bpf+0x1edd/0x2c30
  __x64_sys_bpf+0x21/0x30
  do_syscall_64+0xbb/0x370
  entry_SYSCALL_64_after_hwframe+0x77/0x7f

This happens because we skip initialization for tasks that are already
dead (with their usage counter set to zero), but we don't exclude them
during the scheduling class transition phase.

Fix this by also skipping dead tasks during class swiching, preventing
invalid task state transitions.

Fixes: a8532fac7b5d2 ("sched_ext: TASK_DEAD tasks must be switched into SCX on ops_enable")
Signed-off-by: Andrea Righi <arighi@nvidia.com>
---
 kernel/sched/ext.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
index 7dedc9a16281b..4ae32ef179dd0 100644
--- a/kernel/sched/ext.c
+++ b/kernel/sched/ext.c
@@ -5749,6 +5749,9 @@ static int scx_enable(struct sched_ext_ops *ops, struct bpf_link *link)
 			__setscheduler_class(p->policy, p->prio);
 		struct sched_enq_and_set_ctx ctx;
 
+		if (!tryget_task_struct(p))
+			continue;
+
 		if (old_class != new_class && p->se.sched_delayed)
 			dequeue_task(task_rq(p), p, DEQUEUE_SLEEP | DEQUEUE_DELAYED);
 
@@ -5761,6 +5764,7 @@ static int scx_enable(struct sched_ext_ops *ops, struct bpf_link *link)
 		sched_enq_and_set_task(&ctx);
 
 		check_class_changed(task_rq(p), p, old_class, p->prio);
+		put_task_struct(p);
 	}
 	scx_task_iter_stop(&sti);
 	percpu_up_write(&scx_fork_rwsem);
-- 
2.50.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] sched/ext: Fix invalid task state transitions on class switch
  2025-08-05  8:59 [PATCH] sched/ext: Fix invalid task state transitions on class switch Andrea Righi
@ 2025-08-09 19:05 ` Tejun Heo
  0 siblings, 0 replies; 2+ messages in thread
From: Tejun Heo @ 2025-08-09 19:05 UTC (permalink / raw)
  To: Andrea Righi; +Cc: David Vernet, Changwoo Min, sched-ext, linux-kernel

On Tue, Aug 05, 2025 at 10:59:11AM +0200, Andrea Righi wrote:
> When enabling a sched_ext scheduler, we may trigger invalid task state
> transitions, resulting in warnings like the following (which can be
> easily reproduced by running the hotplug selftest in a loop):
> 
>  sched_ext: Invalid task state transition 0 -> 3 for fish[770]
>  WARNING: CPU: 18 PID: 787 at kernel/sched/ext.c:3862 scx_set_task_state+0x7c/0xc0
>  ...
>  RIP: 0010:scx_set_task_state+0x7c/0xc0
>  ...
>  Call Trace:
>   <TASK>
>   scx_enable_task+0x11f/0x2e0
>   switching_to_scx+0x24/0x110
>   scx_enable.isra.0+0xd14/0x13d0
>   bpf_struct_ops_link_create+0x136/0x1a0
>   __sys_bpf+0x1edd/0x2c30
>   __x64_sys_bpf+0x21/0x30
>   do_syscall_64+0xbb/0x370
>   entry_SYSCALL_64_after_hwframe+0x77/0x7f
> 
> This happens because we skip initialization for tasks that are already
> dead (with their usage counter set to zero), but we don't exclude them
> during the scheduling class transition phase.
> 
> Fix this by also skipping dead tasks during class swiching, preventing
> invalid task state transitions.
> 
> Fixes: a8532fac7b5d2 ("sched_ext: TASK_DEAD tasks must be switched into SCX on ops_enable")
> Signed-off-by: Andrea Righi <arighi@nvidia.com>

Applied to sched_ext/for-6.17-fixes.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-08-09 19:05 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-05  8:59 [PATCH] sched/ext: Fix invalid task state transitions on class switch Andrea Righi
2025-08-09 19:05 ` Tejun Heo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).