Skip to content

Commit 3073f6d

Browse files
ranxiaokaigregkh
authored andcommitted
cpu/hotplug: Don't offline the last non-isolated CPU
[ Upstream commit 38685e2 ] 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 Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent f6cc3d8 commit 3073f6d

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
@@ -1523,11 +1523,14 @@ static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target)
15231523
/*
15241524
* Ensure that the control task does not run on the to be offlined
15251525
* CPU to prevent a deadlock against cfs_b->period_timer.
1526+
* Also keep at least one housekeeping cpu onlined to avoid generating
1527+
* an empty sched_domain span.
15261528
*/
1527-
cpu = cpumask_any_but(cpu_online_mask, cpu);
1528-
if (cpu >= nr_cpu_ids)
1529-
return -EBUSY;
1530-
return work_on_cpu(cpu, __cpu_down_maps_locked, &work);
1529+
for_each_cpu_and(cpu, cpu_online_mask, housekeeping_cpumask(HK_TYPE_DOMAIN)) {
1530+
if (cpu != work.cpu)
1531+
return work_on_cpu(cpu, __cpu_down_maps_locked, &work);
1532+
}
1533+
return -EBUSY;
15311534
}
15321535

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

0 commit comments

Comments
 (0)