[PATCHSET v2 sched_ext/for-7.2-fixes] sched_ext: Fix finite-slice ticks on nohz_full
From: Andrea Righi
Date: Tue Jul 07 2026 - 04:31:57 EST
The scheduler tick dependency for EXT tasks can become stale across context
switches on nohz_full CPUs. An incoming finite-slice task may incorrectly keep
the tick disabled because the scheduler still observes the outgoing task. The
same can happen after an idle interval when the previous EXT task also had a
finite slice. Likewise, when the last finite-slice EXT task is dequeued, its
outgoing state can incorrectly keep the tick enabled after the CPU goes idle.
Fix this by directly asserting the scheduler tick dependency whenever a
finite-slice EXT task is selected and by ignoring the outgoing EXT slice state
when no EXT tasks are accounted on the runqueue.
Moreover, provide a kselftest that exercises both infinite-to-finite and
finite-to-finite transitions across an idle interval and verifies that scheduler
ticks are delivered correctly. The test is skipped when an allowed nohz_full CPU
and a separate housekeeping CPU are not available.
Test case (using virtme-ng):
$ vng -vb --config tools/testing/selftests/sched_ext/config \
--configitem CONFIG_NO_HZ_FULL=y
$ vng --append "nohz_full=all" -- \
tools/testing/selftests/sched_ext/runner -t nohz_tick
Before:
$ vng --append "nohz_full=all" -- tools/testing/selftests/sched_ext/runner -t nohz_tick
===== START =====
TEST: nohz_tick
DESCRIPTION: Verify finite EXT slices restart the NOHZ_FULL tick
OUTPUT:
ERR: nohz_tick.c:277
Finite-slice worker received only 1 scheduler ticks
not ok 1 nohz_tick #
===== END =====
=============================
RESULTS:
PASSED: 0
SKIPPED: 0
FAILED: 1
Failed tests:
- nohz_tick
After:
$ vng --append "nohz_full=all" -- tools/testing/selftests/sched_ext/runner -t nohz_tick
===== START =====
TEST: nohz_tick
DESCRIPTION: Verify finite EXT slices restart the NOHZ_FULL tick
OUTPUT:
CPU 1 received 6 finite-slice ticks
ok 1 nohz_tick #
===== END =====
=============================
RESULTS:
PASSED: 1
SKIPPED: 0
FAILED: 0
Changes in v2:
- Reassert the tick dependency for every selected finite-slice EXT task, fixing
the finite-to-idle-to-finite case and extend the selftest to cover it
(Tejun, sashiko AI)
- Ignore stale outgoing EXT slice state when no EXT tasks are accounted on the
runqueue (sashiko AI).
- Clarify that the infinite-slice bypass scenario is unreachable because bypass
mode always assigns finite slices (sashiko AI).
- Kill test workers automatically if their parent exits unexpectedly in the
selfetst (sashiko AI)
- Link to v1: https://lore.kernel.org/all/20260706162819.650155-1-arighi@xxxxxxxxxx/
Andrea Righi (2):
sched_ext: Enable tick for finite slices on nohz_full
selftests/sched_ext: Verify nohz_full tick behavior
kernel/sched/ext/ext.c | 31 +-
tools/testing/selftests/sched_ext/Makefile | 1 +
tools/testing/selftests/sched_ext/nohz_tick.bpf.c | 65 ++++
tools/testing/selftests/sched_ext/nohz_tick.c | 347 ++++++++++++++++++++++
4 files changed, 440 insertions(+), 4 deletions(-)
create mode 100644 tools/testing/selftests/sched_ext/nohz_tick.bpf.c
create mode 100644 tools/testing/selftests/sched_ext/nohz_tick.c