aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Nixon <alex.nixon@citrix.com>2008-08-22 06:52:14 -0400
committerIngo Molnar <mingo@elte.hu>2008-08-25 04:59:20 -0400
commit8227dce7dc2cfdcc28ee0eadfb482a7ee77fba03 (patch)
tree04cdd6ed74406bc1393cc7518fee596a1260f6e4
parenta21f5d88c17a40941f6239d1959d89e8493e8e01 (diff)
x86: separate generic cpu disabling code from APIC writes in cpu_disable
It allows paravirt implementations of cpu_disable to share the cpu_disable_common code, without having to take on board APIC writes, which may not be appropriate. Signed-off-by: Alex Nixon <alex.nixon@citrix.com> Acked-by: Jeremy Fitzhardinge <jeremy@goop.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/smpboot.c40
-rw-r--r--include/asm-x86/smp.h1
2 files changed, 24 insertions, 17 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 28b4287296aa..66b04e598817 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1346,25 +1346,9 @@ static void __ref remove_cpu_from_maps(int cpu)
1346 numa_remove_cpu(cpu); 1346 numa_remove_cpu(cpu);
1347} 1347}
1348 1348
1349int native_cpu_disable(void) 1349void cpu_disable_common(void)
1350{ 1350{
1351 int cpu = smp_processor_id(); 1351 int cpu = smp_processor_id();
1352
1353 /*
1354 * Perhaps use cpufreq to drop frequency, but that could go
1355 * into generic code.
1356 *
1357 * We won't take down the boot processor on i386 due to some
1358 * interrupts only being able to be serviced by the BSP.
1359 * Especially so if we're not using an IOAPIC -zwane
1360 */
1361 if (cpu == 0)
1362 return -EBUSY;
1363
1364 if (nmi_watchdog == NMI_LOCAL_APIC)
1365 stop_apic_nmi_watchdog(NULL);
1366 clear_local_APIC();
1367
1368 /* 1352 /*
1369 * HACK: 1353 * HACK:
1370 * Allow any queued timer interrupts to get serviced 1354 * Allow any queued timer interrupts to get serviced
@@ -1382,6 +1366,28 @@ int native_cpu_disable(void)
1382 remove_cpu_from_maps(cpu); 1366 remove_cpu_from_maps(cpu);
1383 unlock_vector_lock(); 1367 unlock_vector_lock();
1384 fixup_irqs(cpu_online_map); 1368 fixup_irqs(cpu_online_map);
1369}
1370
1371int native_cpu_disable(void)
1372{
1373 int cpu = smp_processor_id();
1374
1375 /*
1376 * Perhaps use cpufreq to drop frequency, but that could go
1377 * into generic code.
1378 *
1379 * We won't take down the boot processor on i386 due to some
1380 * interrupts only being able to be serviced by the BSP.
1381 * Especially so if we're not using an IOAPIC -zwane
1382 */
1383 if (cpu == 0)
1384 return -EBUSY;
1385
1386 if (nmi_watchdog == NMI_LOCAL_APIC)
1387 stop_apic_nmi_watchdog(NULL);
1388 clear_local_APIC();
1389
1390 cpu_disable_common();
1385 return 0; 1391 return 0;
1386} 1392}
1387 1393
diff --git a/include/asm-x86/smp.h b/include/asm-x86/smp.h
index 17305e72f348..8bdaa4a25f05 100644
--- a/include/asm-x86/smp.h
+++ b/include/asm-x86/smp.h
@@ -125,6 +125,7 @@ static inline void arch_send_call_function_ipi(cpumask_t mask)
125 smp_ops.send_call_func_ipi(mask); 125 smp_ops.send_call_func_ipi(mask);
126} 126}
127 127
128void cpu_disable_common(void);
128void native_smp_prepare_boot_cpu(void); 129void native_smp_prepare_boot_cpu(void);
129void native_smp_prepare_cpus(unsigned int max_cpus); 130void native_smp_prepare_cpus(unsigned int max_cpus);
130void native_smp_cpus_done(unsigned int max_cpus); 131void native_smp_cpus_done(unsigned int max_cpus);