Re: [PATCH] cpu: Fix online housekeeping CPU check in _cpu_down()
From: Waiman Long
Date: Sun Nov 08 2026 - 13:19:19 EST
Mathieu,
Sorry, I forgot to cc you on this patch.
Cheers,
Longman
On 11/8/26 1:08 PM, Waiman Long wrote:
There is currently a check in _cpu_down() to make sure that there is
at least one online housekeeping (HK) CPU left after the shutdown of
the given @cpu parameter. However the cpu_online_mask used for the
check may include the current @cpu to be shut down. So the fact that
there is at least one online housekeeping CPU at the moment does not
guarantee that there will be any online housekeeping CPU left for the
sched domain after the shutdown.
Fix that by making sure that there are at least 2 online housekeeping
CPUs available if @cpu is currently a housekeeping CPU.
Fixes: de715325cc47 ("cpu: Revert "cpu/hotplug: Prevent self deadlock on CPU hot-unplug"")
Signed-off-by: Waiman Long <longman@xxxxxxxxxx>
---
kernel/cpu.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/kernel/cpu.c b/kernel/cpu.c
index b3c8553d7bd6..ed641ee6b37c 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1415,11 +1415,14 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
cpus_write_lock();
/*
- * Keep at least one housekeeping cpu onlined to avoid generating
- * an empty sched_domain span.
+ * Keep at least one housekeeping cpu online to avoid generating an
+ * empty sched_domain span. As cpu_online_mask includes the @cpu to be
+ * shut down, there should be at least 2 online HK CPUs at the moment
+ * if @cpu is currently a HK CPU.
*/
- if (cpumask_any_and(cpu_online_mask,
- housekeeping_cpumask(HK_TYPE_DOMAIN)) >= nr_cpu_ids) {
+ if (cpumask_test_cpu(cpu, housekeeping_cpumask(HK_TYPE_DOMAIN)) &&
+ (cpumask_weight_and(cpu_online_mask,
+ housekeeping_cpumask(HK_TYPE_DOMAIN)) < 2)) {
ret = -EBUSY;
goto out;
}