[PATCH v2 0/2] sched/deadline: Fix zero-CPU DL bandwidth handling

From: Hui Su

Date: Sat Sep 19 2026 - 11:34:04 EST


During CPU hot-unplug, a CPU is removed from cpu_active_mask before it
becomes offline. If it is the last active CPU in a root domain,
dl_bw_cpus() can therefore return zero while paths associated with the CPU
are still reachable.

v1 addressed this in the DL server parameter-update path. Mikhail Zaslonko
reported the same divide-by-zero on s390x through sched_setscheduler(),
showing that the problem is more general, and pointed out several other
callers of __dl_sub() and __dl_add().

This version moves the zero-CPU handling into those common helpers. The
debugfs cpu_active() check is kept as a separate follow-up because it
completes the offline-CPU check added by 4043f5498416, while the generic
helper issue dates back much further. Keeping them separate also gives the
two fixes the appropriate stable backport scopes.

Patch 1 fixes the generic divide-by-zero while retaining the existing
total_bw update when no active CPU remains.

Patch 2 rejects per-CPU DL server debugfs writes once the CPU becomes
inactive instead of waiting until it is fully offline.

Validation on x86_64 included:
- cpus=0/1/2/4 DL bandwidth accounting
- targeted task_non_contending() and inactive_task_timer() zero-CPU paths
- 100 root-domain rebuild/offline-online cycles with accounting checks
- 200 cross-root-domain SCHED_DEADLINE cpuset moves
- SCHED_FLAG_RECLAIM policy transitions
- concurrent SCHED_DEADLINE/SCHED_OTHER transitions and CPU hotplug
- 100 CPU hotplug/debugfs update cycles
- A/B validation of the inactive-but-online debugfs window: the write was
accepted and changed runtime with patch 1 only, but was rejected and left
runtime unchanged with both patches

The final series was also built and boot-smoke-tested from its exact HEAD.

Changes since v1:
- Handle cpus == 0 in __dl_sub() and __dl_add(), as suggested by Mikhail.
- Split the generic bandwidth fix from the DL server debugfs check.
- Add the s390x sched_setscheduler() report.
- Extend validation to the other DL bandwidth paths and accounting cases.

Hui Su (2):
sched/deadline: Fix divide-by-zero in DL bandwidth accounting
sched/deadline: Reject debugfs dl_server writes for inactive CPUs

kernel/sched/deadline.c | 6 ++++--
kernel/sched/debug.c | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)


base-commit: f259f446f5198d98e13756d2cd531812a0ad3064
--
2.55.0