diff options
author | Ashok Raj <ashok.raj@intel.com> | 2005-04-22 17:44:40 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-04-22 17:44:40 -0400 |
commit | b8d8b883e6f029e99c35c88f853501740e322131 (patch) | |
tree | 391f2ade8823149f217991eb02911bf3dacce050 /arch/ia64/kernel/process.c | |
parent | 7130667107cd3ab9d6802b69bab63c7d22f20bd4 (diff) |
[IA64] cpu hotplug: return offlined cpus to SAL
This patch is required to support cpu removal for IPF systems. Existing code
just fakes the real offline by keeping it run the idle thread, and polling
for the bit to re-appear in the cpu_state to get out of the idle loop.
For the cpu-offline to work correctly, we need to pass control of this CPU
back to SAL so it can continue in the boot-rendez mode. This gives the
SAL control to not pick this cpu as the monarch processor for global MCA
events, and addition does not wait for this cpu to checkin with SAL
for global MCA events as well. The handoff is implemented as documented in
SAL specification section 3.2.5.1 "OS_BOOT_RENDEZ to SAL return State"
Signed-off-by: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/process.c')
-rw-r--r-- | arch/ia64/kernel/process.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 91293388dd29..7c43aea5f7f7 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1998-2003 Hewlett-Packard Co | 4 | * Copyright (C) 1998-2003 Hewlett-Packard Co |
5 | * David Mosberger-Tang <davidm@hpl.hp.com> | 5 | * David Mosberger-Tang <davidm@hpl.hp.com> |
6 | * 04/11/17 Ashok Raj <ashok.raj@intel.com> Added CPU Hotplug Support | ||
6 | */ | 7 | */ |
7 | #define __KERNEL_SYSCALLS__ /* see <asm/unistd.h> */ | 8 | #define __KERNEL_SYSCALLS__ /* see <asm/unistd.h> */ |
8 | #include <linux/config.h> | 9 | #include <linux/config.h> |
@@ -200,27 +201,20 @@ default_idle (void) | |||
200 | static inline void play_dead(void) | 201 | static inline void play_dead(void) |
201 | { | 202 | { |
202 | extern void ia64_cpu_local_tick (void); | 203 | extern void ia64_cpu_local_tick (void); |
204 | unsigned int this_cpu = smp_processor_id(); | ||
205 | |||
203 | /* Ack it */ | 206 | /* Ack it */ |
204 | __get_cpu_var(cpu_state) = CPU_DEAD; | 207 | __get_cpu_var(cpu_state) = CPU_DEAD; |
205 | 208 | ||
206 | /* We shouldn't have to disable interrupts while dead, but | ||
207 | * some interrupts just don't seem to go away, and this makes | ||
208 | * it "work" for testing purposes. */ | ||
209 | max_xtp(); | 209 | max_xtp(); |
210 | local_irq_disable(); | 210 | local_irq_disable(); |
211 | /* Death loop */ | 211 | idle_task_exit(); |
212 | while (__get_cpu_var(cpu_state) != CPU_UP_PREPARE) | 212 | ia64_jump_to_sal(&sal_boot_rendez_state[this_cpu]); |
213 | cpu_relax(); | ||
214 | |||
215 | /* | 213 | /* |
216 | * Enable timer interrupts from now on | 214 | * The above is a point of no-return, the processor is |
217 | * Not required if we put processor in SAL_BOOT_RENDEZ mode. | 215 | * expected to be in SAL loop now. |
218 | */ | 216 | */ |
219 | local_flush_tlb_all(); | 217 | BUG(); |
220 | cpu_set(smp_processor_id(), cpu_online_map); | ||
221 | wmb(); | ||
222 | ia64_cpu_local_tick (); | ||
223 | local_irq_enable(); | ||
224 | } | 218 | } |
225 | #else | 219 | #else |
226 | static inline void play_dead(void) | 220 | static inline void play_dead(void) |