diff options
Diffstat (limited to 'arch/ia64/kernel/smp.c')
-rw-r--r-- | arch/ia64/kernel/smp.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index 6ab95ceaf9d4..b1b9aa4364b9 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
31 | #include <linux/efi.h> | 31 | #include <linux/efi.h> |
32 | #include <linux/bitops.h> | 32 | #include <linux/bitops.h> |
33 | #include <linux/kexec.h> | ||
33 | 34 | ||
34 | #include <asm/atomic.h> | 35 | #include <asm/atomic.h> |
35 | #include <asm/current.h> | 36 | #include <asm/current.h> |
@@ -66,6 +67,7 @@ static volatile struct call_data_struct *call_data; | |||
66 | 67 | ||
67 | #define IPI_CALL_FUNC 0 | 68 | #define IPI_CALL_FUNC 0 |
68 | #define IPI_CPU_STOP 1 | 69 | #define IPI_CPU_STOP 1 |
70 | #define IPI_KDUMP_CPU_STOP 3 | ||
69 | 71 | ||
70 | /* This needs to be cacheline aligned because it is written to by *other* CPUs. */ | 72 | /* This needs to be cacheline aligned because it is written to by *other* CPUs. */ |
71 | static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned; | 73 | static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned; |
@@ -155,7 +157,11 @@ handle_IPI (int irq, void *dev_id) | |||
155 | case IPI_CPU_STOP: | 157 | case IPI_CPU_STOP: |
156 | stop_this_cpu(); | 158 | stop_this_cpu(); |
157 | break; | 159 | break; |
158 | 160 | #ifdef CONFIG_CRASH_DUMP | |
161 | case IPI_KDUMP_CPU_STOP: | ||
162 | unw_init_running(kdump_cpu_freeze, NULL); | ||
163 | break; | ||
164 | #endif | ||
159 | default: | 165 | default: |
160 | printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which); | 166 | printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which); |
161 | break; | 167 | break; |
@@ -213,6 +219,26 @@ send_IPI_self (int op) | |||
213 | send_IPI_single(smp_processor_id(), op); | 219 | send_IPI_single(smp_processor_id(), op); |
214 | } | 220 | } |
215 | 221 | ||
222 | #ifdef CONFIG_CRASH_DUMP | ||
223 | void | ||
224 | kdump_smp_send_stop() | ||
225 | { | ||
226 | send_IPI_allbutself(IPI_KDUMP_CPU_STOP); | ||
227 | } | ||
228 | |||
229 | void | ||
230 | kdump_smp_send_init() | ||
231 | { | ||
232 | unsigned int cpu, self_cpu; | ||
233 | self_cpu = smp_processor_id(); | ||
234 | for_each_online_cpu(cpu) { | ||
235 | if (cpu != self_cpu) { | ||
236 | if(kdump_status[cpu] == 0) | ||
237 | platform_send_ipi(cpu, 0, IA64_IPI_DM_INIT, 0); | ||
238 | } | ||
239 | } | ||
240 | } | ||
241 | #endif | ||
216 | /* | 242 | /* |
217 | * Called with preeemption disabled. | 243 | * Called with preeemption disabled. |
218 | */ | 244 | */ |