ARM: do not mark CPU 0 as hotpluggable
diff mbox

Message ID
State New, archived
Headers show

Commit Message

Mike Turquette July 21, 2011, 10:18 p.m. UTC
On Thu, Jul 21, 2011 at 12:45 AM, Russell King - ARM Linux
<> wrote:
> On Wed, Jul 20, 2011 at 04:32:25PM -0700, Mike Turquette wrote:
>> A quick poll of the ARM platforms that implement CPU Hotplug support
>> shows that every platform treats CPU 0 as a special case that cannot be
>> hotplugged.  In fact every platform has identical code for
>> platform_cpu_die which returns -EPERM in the case of CPU 0.
> Are you sure that's just not because everyone copied what Realview has
> been doing (highly likely)?

Copy/paste is always likely.  Would be nice for other platform folks
to weigh in on this.

> I suspect that there's no reason that CPU0 can't be taken down, especially
> on those platforms which don't take the CPU fully offline but just put it
> into a WFI loop.
> Those which restart the CPUs through the boot loader probably detect CPU0
> as the boot CPU, so they probably can't take CPU0 down.

OMAP does seem to have this limitation and Santosh/Richard can provide
much better details than me in the parallel thread.  Again, would be
nice to hear if other platforms have similar limitations from their

The idea here is to not mark a CPU hotpluggable if it cannot be
hotplugged.  If the limitations turn out to be legitimate for some
platforms but not others, what's the best way to handle it?  Either
move the topology initialization to platform code or allow platforms
to set some config option.  Patches for the latter are below, but I
think the current discussion on whether or not other platforms can
actually hotplug CPU0 should run its course before considering below
patches too seriously.

From b734cedf23a9f8366faa1a961d87cb4bc221291e Mon Sep 17 00:00:00 2001
From: Mike Turquette <>
Date: Mon, 18 Jul 2011 17:33:22 -0700
Subject: [PATCH 1/2] ARM: conditionally allow master CPU hotplugging

Currently all CPUs are marked as hotpluggable in topology_init().  This
is not true for all ARM SMP platforms including OMAP4.  In the OMAP4
case, CPU0 is considered as privileged due to TrustZone software and
other considerations.

This patch introduces a new config option, HOTPLUG_CPU_MASTER, which
prevents the first CPU in possible_cpu_mask from being marked
hotpluggable if set.

Signed-off-by: Mike Turquette <>
 arch/arm/Kconfig        |    8 ++++++++
 arch/arm/kernel/setup.c |    5 +++++
 2 files changed, 13 insertions(+), 0 deletions(-)

diff mbox

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9adc278..a6e34f5 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1393,6 +1393,14 @@  config HOTPLUG_CPU
 	  Say Y here to experiment with turning CPUs off and on.  CPUs
 	  can be controlled through /sys/devices/system/cpu.

+	bool "Prevent first CPU (master) from hotplugging"
+	depends on HOTPLUG_CPU
+	help
+	  Say Y here if your platform treats the first CPU as a special
+	  "master" CPU and cannot allow it to hotplug.  This prevents the
+	  "online" entry in sysfs for that CPU.
 	bool "Use local timer interrupts"
 	depends on SMP
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index ed11fb0..3785420 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -940,7 +940,12 @@  static int __init topology_init(void)

 	for_each_possible_cpu(cpu) {
 		struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu);
+		if (cpu)
+			cpuinfo->cpu.hotpluggable = 1;
 		cpuinfo->cpu.hotpluggable = 1;
 		register_cpu(&cpuinfo->cpu, cpu);



From 5e22ea1fa6a10ea0440057832496087297079a5d Mon Sep 17 00:00:00 2001
From: Mike Turquette <>
Date: Tue, 19 Jul 2011 16:47:11 -0700
Subject: [PATCH 2/2] OMAP4: Kconfig: remove hotplug control for CPU0

On OMAP4, CPU0 cannot be dynamically offlined through the usual CPU
hotplug mechanism due to a variety of constraints.  It is treated as a
special "master" CPU for these reasons.

Select HOTPLUG_CPU_MASTER to prevent creation of the hotplug control
entry in sysfs.

Signed-off-by: Mike Turquette <>
 arch/arm/mach-omap2/Kconfig |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 4ae6257..b6199e3 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -51,6 +51,7 @@  config ARCH_OMAP4
 	select ARCH_HAS_OPP
 	select PM_OPP if PM

 comment "OMAP Core Type"
 	depends on ARCH_OMAP2