hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I3Z80Y CVE: NA
-------------------------------------------------
New config switch CONFIG_ARM64_BOOTPARAM_HOTPLUG_CPU0 sets whether default state of arm64_cpu0_hotpluggable is on or off.
If the config switch is off, arm64_cpu0_hotpluggable is off by default. But arm64_cpu0_hotpluggable can still be turned on by kernel parameter arm64_cpu0_hotplug at boot.
If the config switch is on, arm64_cpu0_hotpluggable is always on.
whether CPU0 is hotpluggable depends on cpu_can_disable(0) and arm64_cpu0_hotpluggable.
The default value of the config switch is off.
Signed-off-by: Zheng Zengkai zhengzengkai@huawei.com Reviewed-by: Hanjun Guo guohanjun@huawei.com Signed-off-by: Cheng Jian cj.chengjian@huawei.com --- .../admin-guide/kernel-parameters.txt | 8 ++++++ arch/arm64/Kconfig | 28 +++++++++++++++++++ arch/arm64/kernel/setup.c | 18 +++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index fb09146e9841..d7a718d55e5f 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3457,6 +3457,14 @@ If the dependencies are under your control, you can turn on cpu0_hotplug.
+ arm64_cpu0_hotplug [ARM64] Turn on CPU0 hotplug feature when + CONFIG_ARM64_BOOTPARAM_HOTPLUG_CPU0 is off. + Some features depend on CPU0. Known dependency is: + MegaRAID Tri-Mode SAS3508 may block the reboot process + after offline CPU0. + If the dependencies are under your control, you can + turn on arm64_cpu0_hotplug. + nps_mtm_hs_ctr= [KNL,ARC] This parameter sets the maximum duration, in cycles, each HW thread of the CTOP can run diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index c17672cceb03..15a44e2efa09 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -997,6 +997,34 @@ config HOTPLUG_CPU Say Y here to experiment with turning CPUs off and on. CPUs can be controlled through /sys/devices/system/cpu.
+config ARM64_BOOTPARAM_HOTPLUG_CPU0 + bool "Set default setting of arm64_cpu0_hotpluggable" + default n + depends on HOTPLUG_CPU + help + Set whether default state of arm64_cpu0_hotpluggable is on or off. + + Say Y here to enable CPU0 hotplug by default. If this switch + is turned on, there is no need to give arm64_cpu0_hotplug kernel + parameter and the CPU0 hotplug feature is enabled by default. + + Please note: there may be some CPU0 dependencies if you want + to enable the CPU0 hotplug feature either by this switch or by + arm64_cpu0_hotplug kernel parameter. + + For example: + We found the following issue related to CPU0 dependency: + 1. echo 0 > /sys/devices/system/cpu/cpu0/online + 2. reboot + MegaRAID Tri-Mode SAS3508 may block the reboot process. + + Please make sure the dependencies are under your control before + you enable this feature. + + Say N if you don't want to enable CPU0 hotplug feature by default. + You still can enable the CPU0 hotplug feature at boot by kernel + parameter arm64_cpu0_hotplug. + config MPAM bool "Support Memory Partitioning and Monitoring" default n diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 2ffe8d936d94..cd512fc7c394 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -54,6 +54,19 @@ static int num_standard_resources; static struct resource *standard_resources;
+#ifdef CONFIG_ARM64_BOOTPARAM_HOTPLUG_CPU0 +static int arm64_cpu0_hotpluggable = 1; +#else +static int arm64_cpu0_hotpluggable; +static int __init arm64_enable_cpu0_hotplug(char *str) +{ + arm64_cpu0_hotpluggable = 1; + return 1; +} + +__setup("arm64_cpu0_hotplug", arm64_enable_cpu0_hotplug); +#endif + phys_addr_t __fdt_pointer __initdata;
/* @@ -410,7 +423,10 @@ static int __init topology_init(void)
for_each_present_cpu(i) { struct cpu *cpu = &per_cpu(cpu_data.cpu, i); - cpu->hotpluggable = cpu_can_disable(i); + if (i == 0) + cpu->hotpluggable = cpu_can_disable(0) && arm64_cpu0_hotpluggable; + else + cpu->hotpluggable = cpu_can_disable(i); register_cpu(cpu, i); }