aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2005-07-29 00:15:27 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-29 00:45:58 -0400
commit61b1b2d0239da82c0bed8adaa1d070c6551d4afd (patch)
tree121b652c8b6915d17beb622086e362a9e9c1733e /arch/x86_64
parent5b943fbfaf0dbdd3cd9ff2dda100f0b8c47a7d8c (diff)
[PATCH] x86_64: Move cpu_present/possible_map parsing earlier
Various code needs this information now before the actual SMP bootup. Instead of computing it on the fly while booting the other CPUs set it up now while initial MPtable/MADT parsing. Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/kernel/mpparse.c17
-rw-r--r--arch/x86_64/kernel/smpboot.c55
2 files changed, 35 insertions, 37 deletions
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
index 9c5aa2a790c7..08abf9f5b159 100644
--- a/arch/x86_64/kernel/mpparse.c
+++ b/arch/x86_64/kernel/mpparse.c
@@ -109,7 +109,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
109 109
110static void __init MP_processor_info (struct mpc_config_processor *m) 110static void __init MP_processor_info (struct mpc_config_processor *m)
111{ 111{
112 int ver; 112 int ver, cpu;
113 static int found_bsp=0; 113 static int found_bsp=0;
114 114
115 if (!(m->mpc_cpuflag & CPU_ENABLED)) 115 if (!(m->mpc_cpuflag & CPU_ENABLED))
@@ -131,7 +131,7 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
131 return; 131 return;
132 } 132 }
133 133
134 num_processors++; 134 cpu = num_processors++;
135 135
136 if (m->mpc_apicid > MAX_APICS) { 136 if (m->mpc_apicid > MAX_APICS) {
137 printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", 137 printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
@@ -155,13 +155,18 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
155 * in same order as logical cpu numbers. Hence the first 155 * in same order as logical cpu numbers. Hence the first
156 * entry is BSP, and so on. 156 * entry is BSP, and so on.
157 */ 157 */
158 cpu = 0;
159
158 bios_cpu_apicid[0] = m->mpc_apicid; 160 bios_cpu_apicid[0] = m->mpc_apicid;
159 x86_cpu_to_apicid[0] = m->mpc_apicid; 161 x86_cpu_to_apicid[0] = m->mpc_apicid;
160 found_bsp = 1; 162 found_bsp = 1;
161 } else { 163 } else
162 bios_cpu_apicid[num_processors - found_bsp] = m->mpc_apicid; 164 cpu = num_processors - found_bsp;
163 x86_cpu_to_apicid[num_processors - found_bsp] = m->mpc_apicid; 165 bios_cpu_apicid[cpu] = m->mpc_apicid;
164 } 166 x86_cpu_to_apicid[cpu] = m->mpc_apicid;
167
168 cpu_set(cpu, cpu_possible_map);
169 cpu_set(cpu, cpu_present_map);
165} 170}
166 171
167static void __init MP_bus_info (struct mpc_config_bus *m) 172static void __init MP_bus_info (struct mpc_config_bus *m)
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c
index e773a794ec45..db27e1844ed2 100644
--- a/arch/x86_64/kernel/smpboot.c
+++ b/arch/x86_64/kernel/smpboot.c
@@ -113,24 +113,6 @@ struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ;
113#define set_idle_for_cpu(x,p) (idle_thread_array[(x)] = (p)) 113#define set_idle_for_cpu(x,p) (idle_thread_array[(x)] = (p))
114 114
115/* 115/*
116 * cpu_possible_map should be static, it cannot change as cpu's
117 * are onlined, or offlined. The reason is per-cpu data-structures
118 * are allocated by some modules at init time, and dont expect to
119 * do this dynamically on cpu arrival/departure.
120 * cpu_present_map on the other hand can change dynamically.
121 * In case when cpu_hotplug is not compiled, then we resort to current
122 * behaviour, which is cpu_possible == cpu_present.
123 * If cpu-hotplug is supported, then we need to preallocate for all
124 * those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
125 * - Ashok Raj
126 */
127#ifdef CONFIG_HOTPLUG_CPU
128#define fixup_cpu_possible_map(x) cpu_set((x), cpu_possible_map)
129#else
130#define fixup_cpu_possible_map(x)
131#endif
132
133/*
134 * Currently trivial. Write the real->protected mode 116 * Currently trivial. Write the real->protected mode
135 * bootstrap into the page concerned. The caller 117 * bootstrap into the page concerned. The caller
136 * has made sure it's suitably aligned. 118 * has made sure it's suitably aligned.
@@ -924,6 +906,27 @@ static __init void enforce_max_cpus(unsigned max_cpus)
924 } 906 }
925} 907}
926 908
909#ifdef CONFIG_HOTPLUG_CPU
910/*
911 * cpu_possible_map should be static, it cannot change as cpu's
912 * are onlined, or offlined. The reason is per-cpu data-structures
913 * are allocated by some modules at init time, and dont expect to
914 * do this dynamically on cpu arrival/departure.
915 * cpu_present_map on the other hand can change dynamically.
916 * In case when cpu_hotplug is not compiled, then we resort to current
917 * behaviour, which is cpu_possible == cpu_present.
918 * If cpu-hotplug is supported, then we need to preallocate for all
919 * those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
920 * - Ashok Raj
921 */
922static void prefill_possible_map(void)
923{
924 int i;
925 for (i = 0; i < NR_CPUS; i++)
926 cpu_set(i, cpu_possible_map);
927}
928#endif
929
927/* 930/*
928 * Various sanity checks. 931 * Various sanity checks.
929 */ 932 */
@@ -987,25 +990,15 @@ static int __init smp_sanity_check(unsigned max_cpus)
987 */ 990 */
988void __init smp_prepare_cpus(unsigned int max_cpus) 991void __init smp_prepare_cpus(unsigned int max_cpus)
989{ 992{
990 int i;
991
992 nmi_watchdog_default(); 993 nmi_watchdog_default();
993 current_cpu_data = boot_cpu_data; 994 current_cpu_data = boot_cpu_data;
994 current_thread_info()->cpu = 0; /* needed? */ 995 current_thread_info()->cpu = 0; /* needed? */
995 996
996 enforce_max_cpus(max_cpus); 997 enforce_max_cpus(max_cpus);
997 998
998 /* 999#ifdef CONFIG_HOTPLUG_CPU
999 * Fill in cpu_present_mask 1000 prefill_possible_map();
1000 */ 1001#endif
1001 for (i = 0; i < NR_CPUS; i++) {
1002 int apicid = cpu_present_to_apicid(i);
1003 if (physid_isset(apicid, phys_cpu_present_map)) {
1004 cpu_set(i, cpu_present_map);
1005 cpu_set(i, cpu_possible_map);
1006 }
1007 fixup_cpu_possible_map(i);
1008 }
1009 1002
1010 if (smp_sanity_check(max_cpus) < 0) { 1003 if (smp_sanity_check(max_cpus) < 0) {
1011 printk(KERN_INFO "SMP disabled\n"); 1004 printk(KERN_INFO "SMP disabled\n");