aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/mpparse_64.c
diff options
context:
space:
mode:
authorMike Travis <travis@sgi.com>2007-10-19 14:35:03 -0400
committerThomas Gleixner <tglx@linutronix.de>2007-10-19 14:35:03 -0400
commit71fff5e6ca1b738ac4742580e4c0ff79d906f6c8 (patch)
tree390e67123d684ab7f490291db987e097e5b3c728 /arch/x86/kernel/mpparse_64.c
parentdbeb2be21d678c49a8d8bbf774903df15dd55474 (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.c15
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
89static void __cpuinit MP_processor_info (struct mpc_config_processor *m) 89static 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);