summaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/smp.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2010-04-26 18:49:58 +0900
committerPaul Mundt <lethal@linux-sh.org>2010-04-26 18:49:58 +0900
commit9715b8c7d55912fb6f5dd9b1c084d8eefcd0d848 (patch)
treea98a752ea797ddd241a10c9100bff91bc1f37f2f /arch/sh/kernel/smp.c
parent7acb59eb4b5eee113eb74eeafd1e6536171eeced (diff)
sh: provide percpu CPU states for hotplug notifiers.
This provides percpu CPU states in preparation for CPU hotplug and the associated notifier chains. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/smp.c')
-rw-r--r--arch/sh/kernel/smp.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c
index cc87830ace7..4d27597c5da 100644
--- a/arch/sh/kernel/smp.c
+++ b/arch/sh/kernel/smp.c
@@ -33,6 +33,9 @@ int __cpu_logical_map[NR_CPUS]; /* Map logical to physical */
struct plat_smp_ops *mp_ops = NULL;
+/* State of each CPU */
+DEFINE_PER_CPU(int, cpu_state) = { 0 };
+
void __cpuinit register_smp_ops(struct plat_smp_ops *ops)
{
if (mp_ops)
@@ -72,11 +75,13 @@ void __devinit smp_prepare_boot_cpu(void)
set_cpu_online(cpu, true);
set_cpu_possible(cpu, true);
+
+ per_cpu(cpu_state, cpu) = CPU_ONLINE;
}
asmlinkage void __cpuinit start_secondary(void)
{
- unsigned int cpu;
+ unsigned int cpu = smp_processor_id();
struct mm_struct *mm = &init_mm;
enable_mmu();
@@ -90,12 +95,10 @@ asmlinkage void __cpuinit start_secondary(void)
preempt_disable();
- notify_cpu_starting(smp_processor_id());
+ notify_cpu_starting(cpu);
local_irq_enable();
- cpu = smp_processor_id();
-
/* Enable local timers */
local_timer_setup(cpu);
calibrate_delay();
@@ -103,6 +106,7 @@ asmlinkage void __cpuinit start_secondary(void)
smp_store_cpu_info(cpu);
set_cpu_online(cpu, true);
+ per_cpu(cpu_state, cpu) = CPU_ONLINE;
cpu_idle();
}
@@ -127,6 +131,8 @@ int __cpuinit __cpu_up(unsigned int cpu)
return PTR_ERR(tsk);
}
+ per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
+
/* Fill in data in head.S for secondary cpus */
stack_start.sp = tsk->thread.sp;
stack_start.thread_info = tsk->stack;