[PATCH v2 1/2] sched/deadline: Fix divide-by-zero in DL bandwidth accounting
From: Hui Su
Date: Sat Sep 19 2026 - 11:33:48 EST
During CPU hot-unplug, a CPU can be cleared from cpu_active_mask before it
is marked offline. This can leave a window where dl_bw_cpus() returns zero
for a root domain with no remaining active CPU.
DL bandwidth paths can pass this zero CPU count to __dl_sub() and
__dl_add(), which then divide by zero while distributing the bandwidth
update to active runqueues.
This is not specific to the DL server debugfs path. Mikhail Zaslonko
reported the same failure on s390x through sched_setscheduler(), where
task_non_contending() reached __dl_sub() with no active CPU in the root
domain. Other DL bandwidth paths use the same helpers.
Keep updating dl_bw::total_bw when the CPU count is zero, but skip
__dl_update(), since there are no active runqueues to receive an extra_bw
adjustment. This avoids the division by zero in all callers while retaining
the existing total_bw update.
Fixes: daec57983670 ("sched/deadline: Reclaim bandwidth not used by dl tasks")
Reported-by: Mikhail Zaslonko <zaslonko@xxxxxxxxxxxxx>
Link: https://lore.kernel.org/r/c52c9e8c-260e-49a4-a88e-229e0795d07b@xxxxxxxxxxxxx
Suggested-by: Mikhail Zaslonko <zaslonko@xxxxxxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
Assisted-by: LLM
Signed-off-by: Hui Su <sh_def@xxxxxxx>
---
kernel/sched/deadline.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 0663c00c41c0..840240cff7b9 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -193,14 +193,16 @@ static inline
void __dl_sub(struct dl_bw *dl_b, u64 tsk_bw, int cpus)
{
dl_b->total_bw -= tsk_bw;
- __dl_update(dl_b, (s32)tsk_bw / cpus);
+ if (cpus)
+ __dl_update(dl_b, (s32)tsk_bw / cpus);
}
static inline
void __dl_add(struct dl_bw *dl_b, u64 tsk_bw, int cpus)
{
dl_b->total_bw += tsk_bw;
- __dl_update(dl_b, -((s32)tsk_bw / cpus));
+ if (cpus)
+ __dl_update(dl_b, -((s32)tsk_bw / cpus));
}
static inline bool
--
2.55.0