Skip to content

Commit 38685e2

Browse files
ranxiaokaiKAGA-KOKO
authored andcommitted
cpu/hotplug: Don't offline the last non-isolated CPU
If a system has isolated CPUs via the "isolcpus=" command line parameter, then an attempt to offline the last housekeeping CPU will result in a WARN_ON() when rebuilding the scheduler domains and a subsequent panic due to and unhandled empty CPU mas in partition_sched_domains_locked(). cpuset_hotplug_workfn() rebuild_sched_domains_locked() ndoms = generate_sched_domains(&doms, &attr); cpumask_and(doms[0], top_cpuset.effective_cpus, housekeeping_cpumask(HK_FLAG_DOMAIN)); Thus results in an empty CPU mask which triggers the warning and then the subsequent crash: WARNING: CPU: 4 PID: 80 at kernel/sched/topology.c:2366 build_sched_domains+0x120c/0x1408 Call trace: build_sched_domains+0x120c/0x1408 partition_sched_domains_locked+0x234/0x880 rebuild_sched_domains_locked+0x37c/0x798 rebuild_sched_domains+0x30/0x58 cpuset_hotplug_workfn+0x2a8/0x930 Unable to handle kernel paging request at virtual address fffe80027ab37080 partition_sched_domains_locked+0x318/0x880 rebuild_sched_domains_locked+0x37c/0x798 Aside of the resulting crash, it does not make any sense to offline the last last housekeeping CPU. Prevent this by masking out the non-housekeeping CPUs when selecting a target CPU for initiating the CPU unplug operation via the work queue. Suggested-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/202310171709530660462@zte.com.cn
1 parent a940daa commit 38685e2

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

kernel/cpu.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,11 +1515,14 @@ static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target)
15151515
/*
15161516
* Ensure that the control task does not run on the to be offlined
15171517
* CPU to prevent a deadlock against cfs_b->period_timer.
1518+
* Also keep at least one housekeeping cpu onlined to avoid generating
1519+
* an empty sched_domain span.
15181520
*/
1519-
cpu = cpumask_any_but(cpu_online_mask, cpu);
1520-
if (cpu >= nr_cpu_ids)
1521-
return -EBUSY;
1522-
return work_on_cpu(cpu, __cpu_down_maps_locked, &work);
1521+
for_each_cpu_and(cpu, cpu_online_mask, housekeeping_cpumask(HK_TYPE_DOMAIN)) {
1522+
if (cpu != work.cpu)
1523+
return work_on_cpu(cpu, __cpu_down_maps_locked, &work);
1524+
}
1525+
return -EBUSY;
15231526
}
15241527

15251528
static int cpu_down(unsigned int cpu, enum cpuhp_state target)

0 commit comments

Comments
 (0)