git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] x86-64: Use physflat on Intel for < 8 CPUs with CPU hotplug
[pandora-kernel.git]
/
arch
/
x86_64
/
kernel
/
genapic.c
diff --git
a/arch/x86_64/kernel/genapic.c
b/arch/x86_64/kernel/genapic.c
index
f062aa0
..
7a64ea1
100644
(file)
--- a/
arch/x86_64/kernel/genapic.c
+++ b/
arch/x86_64/kernel/genapic.c
@@
-20,7
+20,7
@@
#include <asm/smp.h>
#include <asm/ipi.h>
#include <asm/smp.h>
#include <asm/ipi.h>
-#if defined(CONFIG_ACPI
_BUS
)
+#if defined(CONFIG_ACPI)
#include <acpi/acpi_bus.h>
#endif
#include <acpi/acpi_bus.h>
#endif
@@
-45,9
+45,9
@@
void __init clustered_apic_check(void)
u8 clusters, max_cluster;
u8 id;
u8 cluster_cnt[NUM_APIC_CLUSTERS];
u8 clusters, max_cluster;
u8 id;
u8 cluster_cnt[NUM_APIC_CLUSTERS];
- int
num_cpus
= 0;
+ int
max_apic
= 0;
-#if defined(CONFIG_ACPI
_BUS
)
+#if defined(CONFIG_ACPI)
/*
* Some x86_64 machines use physical APIC mode regardless of how many
* procs/clusters are present (x86_64 ES7000 is an example).
/*
* Some x86_64 machines use physical APIC mode regardless of how many
* procs/clusters are present (x86_64 ES7000 is an example).
@@
-64,14
+64,15
@@
void __init clustered_apic_check(void)
id = bios_cpu_apicid[i];
if (id == BAD_APICID)
continue;
id = bios_cpu_apicid[i];
if (id == BAD_APICID)
continue;
- num_cpus++;
+ if (id > max_apic)
+ max_apic = id;
cluster_cnt[APIC_CLUSTERID(id)]++;
}
/* Don't use clustered mode on AMD platforms. */
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
genapic = &apic_physflat;
cluster_cnt[APIC_CLUSTERID(id)]++;
}
/* Don't use clustered mode on AMD platforms. */
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
genapic = &apic_physflat;
-#ifndef CONFIG_
CPU_HOTPLUG
+#ifndef CONFIG_
HOTPLUG_CPU
/* In the CPU hotplug case we cannot use broadcast mode
because that opens a race when a CPU is removed.
Stay at physflat mode in this case.
/* In the CPU hotplug case we cannot use broadcast mode
because that opens a race when a CPU is removed.
Stay at physflat mode in this case.
@@
-79,7
+80,7
@@
void __init clustered_apic_check(void)
we have ACPI platform support for CPU hotplug
we should detect hotplug capablity from ACPI tables and
only do this when really needed. -AK */
we have ACPI platform support for CPU hotplug
we should detect hotplug capablity from ACPI tables and
only do this when really needed. -AK */
- if (
num_cpus
<= 8)
+ if (
max_apic
<= 8)
genapic = &apic_flat;
#endif
goto print;
genapic = &apic_flat;
#endif
goto print;
@@
-103,9
+104,14
@@
void __init clustered_apic_check(void)
* (We don't use lowest priority delivery + HW APIC IRQ steering, so
* can ignore the clustered logical case and go straight to physical.)
*/
* (We don't use lowest priority delivery + HW APIC IRQ steering, so
* can ignore the clustered logical case and go straight to physical.)
*/
- if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster)
+ if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster) {
+#ifdef CONFIG_HOTPLUG_CPU
+ /* Don't use APIC shortcuts in CPU hotplug to avoid races */
+ genapic = &apic_physflat;
+#else
genapic = &apic_flat;
genapic = &apic_flat;
- else
+#endif
+ } else
genapic = &apic_cluster;
print:
genapic = &apic_cluster;
print: