diff options
author | Mike Travis <travis@sgi.com> | 2007-10-19 14:35:03 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2007-10-19 14:35:03 -0400 |
commit | 71fff5e6ca1b738ac4742580e4c0ff79d906f6c8 (patch) | |
tree | 390e67123d684ab7f490291db987e097e5b3c728 /arch/x86/kernel/mpparse_64.c | |
parent | dbeb2be21d678c49a8d8bbf774903df15dd55474 (diff) |
x86: convert cpu_to_apicid to be a per cpu variable
This patch converts the x86_cpu_to_apicid array to be a per cpu
variable. This saves sizeof(apicid) * NR unused cpus. Access is mostly
from startup and CPU HOTPLUG functions.
MP_processor_info() is one of the functions that require access to the
x86_cpu_to_apicid array before the per_cpu data area is setup. For this
case, a pointer to the __initdata array is initialized in setup_arch()
and removed in smp_prepare_cpus() after the per_cpu data area is
initialized.
A second change is included to change the initial array value of ARCH
i386 from 0xff to BAD_APICID to be consistent with ARCH x86_64.
Signed-off-by: Mike Travis <travis@sgi.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/mpparse_64.c')
-rw-r--r-- | arch/x86/kernel/mpparse_64.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/kernel/mpparse_64.c b/arch/x86/kernel/mpparse_64.c index 8bf0ca03ac8e..4336c0fc3b81 100644 --- a/arch/x86/kernel/mpparse_64.c +++ b/arch/x86/kernel/mpparse_64.c | |||
@@ -86,7 +86,7 @@ static int __init mpf_checksum(unsigned char *mp, int len) | |||
86 | return sum & 0xFF; | 86 | return sum & 0xFF; |
87 | } | 87 | } |
88 | 88 | ||
89 | static void __cpuinit MP_processor_info (struct mpc_config_processor *m) | 89 | static void __cpuinit MP_processor_info(struct mpc_config_processor *m) |
90 | { | 90 | { |
91 | int cpu; | 91 | int cpu; |
92 | cpumask_t tmp_map; | 92 | cpumask_t tmp_map; |
@@ -123,7 +123,18 @@ static void __cpuinit MP_processor_info (struct mpc_config_processor *m) | |||
123 | cpu = 0; | 123 | cpu = 0; |
124 | } | 124 | } |
125 | bios_cpu_apicid[cpu] = m->mpc_apicid; | 125 | bios_cpu_apicid[cpu] = m->mpc_apicid; |
126 | x86_cpu_to_apicid[cpu] = m->mpc_apicid; | 126 | /* |
127 | * We get called early in the the start_kernel initialization | ||
128 | * process when the per_cpu data area is not yet setup, so we | ||
129 | * use a static array that is removed after the per_cpu data | ||
130 | * area is created. | ||
131 | */ | ||
132 | if (x86_cpu_to_apicid_ptr) { | ||
133 | u8 *x86_cpu_to_apicid = (u8 *)x86_cpu_to_apicid_ptr; | ||
134 | x86_cpu_to_apicid[cpu] = m->mpc_apicid; | ||
135 | } else { | ||
136 | per_cpu(x86_cpu_to_apicid, cpu) = m->mpc_apicid; | ||
137 | } | ||
127 | 138 | ||
128 | cpu_set(cpu, cpu_possible_map); | 139 | cpu_set(cpu, cpu_possible_map); |
129 | cpu_set(cpu, cpu_present_map); | 140 | cpu_set(cpu, cpu_present_map); |