Sched_ext development
 help / color / mirror / Atom feed
* [PATCH 0/5] sched_ext: selftest infrastructure fixes
@ 2026-10-09 13:40 Tao Cui
  0 siblings, 0 replies; 2+ messages in thread
From: Tao Cui @ 2026-10-09 13:40 UTC (permalink / raw)
  To: Tejun Heo
  Cc: David Vernet, Andrea Righi, Changwoo Min, sched-ext, cui.tao,
	Tao Cui

From: Tao Cui <cuitao@kylinos.cn>

The sched_ext selftests pass vacuously or hang in several failure
scenarios: a scheduler that dies mid-test freezes the state the test
asserts on, EXIT_KIND() silently maps missing BTF enums to
SCX_EXIT_NONE, waits for scheduler exit are unbounded, attach
failures in the reload stress test are swallowed, and an error path
in reload_loop destroys the skeleton under a still-running thread.

  1. selftests/sched_ext: Fix reload_loop error-path use-after-free
     If the second pthread_create() fails, run() returns and the
     runner calls cleanup, which destroys the skeleton while the
     first reload thread is still running do_reload_loop() and
     dereferencing its maps. Set force_exit and join the first
     thread before failing.

  2. sched_ext: Add SCX_ECODE_RSN_CGROUP_OFFLINE to user_exit_info.h
     Sync the tools-side exit code enum with the kernel; without it
     userspace code has no name for this reason.

  3. selftests/sched_ext: Fail loudly when EXIT_KIND is missing from
     BTF. EXIT_KIND() resolves scx_exit_kind values through
     __COMPAT_ENUM_OR_ZERO(), which maps a missing enum to 0 (==
     SCX_EXIT_NONE), so on kernels whose BTF lacks the enum every
     EXIT_KIND() comparison is meaningless. Resolve the value with
     __COMPAT_read_enum() and fail the test when it is missing,
     matching SCX_ECODE_VAL() and SCX_KIND_VAL(). The kick and
     nohz_tick polling helpers switch to UEI_EXITED() so they keep
     their semantics without a BTF lookup.

  4. selftests/sched_ext: Add SCX_ASSERT_ALIVE and adopt it. A
     scheduler that dies mid-test freezes the state that the test is
     about to assert on, so the assertions can pass vacuously.

  5. selftests/sched_ext: Bound exit waits and report reload_loop
     failures. exit, prog_run and hotplug wait for the scheduler to
     exit with no time bound; a scheduler that never exits hangs the
     runner. Bound the waits to ~10s (iteration-based). reload_loop
     skips bpf_map__attach_struct_ops() failures silently: measured
     on a loaded host, 1125-1233 of 2048 iterations failed, all with
     EBUSY (the single scheduler slot changing hands between the two
     threads). Count the failures per thread and fail the test only
     on unexpected errnos or when every attach failed.


Tao Cui (5):
  selftests/sched_ext: Fix reload_loop error-path use-after-free
  sched_ext: Add SCX_ECODE_RSN_CGROUP_OFFLINE to user_exit_info.h
  selftests/sched_ext: Fail loudly when EXIT_KIND is missing from BTF
  selftests/sched_ext: Add SCX_ASSERT_ALIVE and adopt it
  selftests/sched_ext: Bound exit waits and report reload_loop failures

 tools/sched_ext/include/scx/user_exit_info.h  |  1 +
 .../selftests/sched_ext/create_dsq.bpf.c      |  8 +++
 .../testing/selftests/sched_ext/create_dsq.c  |  2 +
 tools/testing/selftests/sched_ext/exit.c      |  4 +-
 tools/testing/selftests/sched_ext/hotplug.c   | 12 +++--
 .../sched_ext/init_enable_count.bpf.c         |  8 +++
 .../selftests/sched_ext/init_enable_count.c   | 13 +++++
 tools/testing/selftests/sched_ext/kick.c      |  8 +--
 .../testing/selftests/sched_ext/maximal.bpf.c |  6 ++-
 tools/testing/selftests/sched_ext/maximal.c   |  2 +
 tools/testing/selftests/sched_ext/nohz_tick.c |  6 +--
 tools/testing/selftests/sched_ext/prog_run.c  |  7 ++-
 .../testing/selftests/sched_ext/reload_loop.c | 53 ++++++++++++++++---
 tools/testing/selftests/sched_ext/scx_test.h  | 48 ++++++++++++++++-
 14 files changed, 155 insertions(+), 23 deletions(-)

-- 
2.53.0


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

* [PATCH 0/5] sched_ext: selftest infrastructure fixes
@ 2026-10-09 13:40 Tao Cui
  0 siblings, 0 replies; 2+ messages in thread
From: Tao Cui @ 2026-10-09 13:40 UTC (permalink / raw)
  To: Tejun Heo
  Cc: David Vernet, Andrea Righi, Changwoo Min, sched-ext, cui.tao,
	Tao Cui

From: Tao Cui <cuitao@kylinos.cn>

The sched_ext selftests pass vacuously or hang in several failure
scenarios: a scheduler that dies mid-test freezes the state the test
asserts on, EXIT_KIND() silently maps missing BTF enums to
SCX_EXIT_NONE, waits for scheduler exit are unbounded, attach
failures in the reload stress test are swallowed, and an error path
in reload_loop destroys the skeleton under a still-running thread.

  1. selftests/sched_ext: Fix reload_loop error-path use-after-free
     If the second pthread_create() fails, run() returns and the
     runner calls cleanup, which destroys the skeleton while the
     first reload thread is still running do_reload_loop() and
     dereferencing its maps. Set force_exit and join the first
     thread before failing.

  2. sched_ext: Add SCX_ECODE_RSN_CGROUP_OFFLINE to user_exit_info.h
     Sync the tools-side exit code enum with the kernel; without it
     userspace code has no name for this reason.

  3. selftests/sched_ext: Fail loudly when EXIT_KIND is missing from
     BTF. EXIT_KIND() resolves scx_exit_kind values through
     __COMPAT_ENUM_OR_ZERO(), which maps a missing enum to 0 (==
     SCX_EXIT_NONE), so on kernels whose BTF lacks the enum every
     EXIT_KIND() comparison is meaningless. Resolve the value with
     __COMPAT_read_enum() and fail the test when it is missing,
     matching SCX_ECODE_VAL() and SCX_KIND_VAL(). The kick and
     nohz_tick polling helpers switch to UEI_EXITED() so they keep
     their semantics without a BTF lookup.

  4. selftests/sched_ext: Add SCX_ASSERT_ALIVE and adopt it. A
     scheduler that dies mid-test freezes the state that the test is
     about to assert on, so the assertions can pass vacuously.

  5. selftests/sched_ext: Bound exit waits and report reload_loop
     failures. exit, prog_run and hotplug wait for the scheduler to
     exit with no time bound; a scheduler that never exits hangs the
     runner. Bound the waits to ~10s (iteration-based). reload_loop
     skips bpf_map__attach_struct_ops() failures silently: measured
     on a loaded host, 1125-1233 of 2048 iterations failed, all with
     EBUSY (the single scheduler slot changing hands between the two
     threads). Count the failures per thread and fail the test only
     on unexpected errnos or when every attach failed.


Tao Cui (5):
  selftests/sched_ext: Fix reload_loop error-path use-after-free
  sched_ext: Add SCX_ECODE_RSN_CGROUP_OFFLINE to user_exit_info.h
  selftests/sched_ext: Fail loudly when EXIT_KIND is missing from BTF
  selftests/sched_ext: Add SCX_ASSERT_ALIVE and adopt it
  selftests/sched_ext: Bound exit waits and report reload_loop failures

 tools/sched_ext/include/scx/user_exit_info.h  |  1 +
 .../selftests/sched_ext/create_dsq.bpf.c      |  8 +++
 .../testing/selftests/sched_ext/create_dsq.c  |  2 +
 tools/testing/selftests/sched_ext/exit.c      |  4 +-
 tools/testing/selftests/sched_ext/hotplug.c   | 12 +++--
 .../sched_ext/init_enable_count.bpf.c         |  8 +++
 .../selftests/sched_ext/init_enable_count.c   | 13 +++++
 tools/testing/selftests/sched_ext/kick.c      |  8 +--
 .../testing/selftests/sched_ext/maximal.bpf.c |  6 ++-
 tools/testing/selftests/sched_ext/maximal.c   |  2 +
 tools/testing/selftests/sched_ext/nohz_tick.c |  6 +--
 tools/testing/selftests/sched_ext/prog_run.c  |  7 ++-
 .../testing/selftests/sched_ext/reload_loop.c | 53 ++++++++++++++++---
 tools/testing/selftests/sched_ext/scx_test.h  | 48 ++++++++++++++++-
 14 files changed, 155 insertions(+), 23 deletions(-)

-- 
2.53.0


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

end of thread, other threads:[~2026-10-09 13:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-09 13:40 [PATCH 0/5] sched_ext: selftest infrastructure fixes Tao Cui
  -- strict thread matches above, loose matches on Subject: below --
2026-10-09 13:40 Tao Cui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox