Commit 61b1b2d0 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[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: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 5b943fbf
...@@ -109,7 +109,7 @@ static int __init mpf_checksum(unsigned char *mp, int len) ...@@ -109,7 +109,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
static void __init MP_processor_info (struct mpc_config_processor *m) static void __init MP_processor_info (struct mpc_config_processor *m)
{ {
int ver; int ver, cpu;
static int found_bsp=0; static int found_bsp=0;
if (!(m->mpc_cpuflag & CPU_ENABLED)) if (!(m->mpc_cpuflag & CPU_ENABLED))
...@@ -131,7 +131,7 @@ static void __init MP_processor_info (struct mpc_config_processor *m) ...@@ -131,7 +131,7 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
return; return;
} }
num_processors++; cpu = num_processors++;
if (m->mpc_apicid > MAX_APICS) { if (m->mpc_apicid > MAX_APICS) {
printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", 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,13 +155,18 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
* in same order as logical cpu numbers. Hence the first * in same order as logical cpu numbers. Hence the first
* entry is BSP, and so on. * entry is BSP, and so on.
*/ */
cpu = 0;
bios_cpu_apicid[0] = m->mpc_apicid; bios_cpu_apicid[0] = m->mpc_apicid;
x86_cpu_to_apicid[0] = m->mpc_apicid; x86_cpu_to_apicid[0] = m->mpc_apicid;
found_bsp = 1; found_bsp = 1;
} else { } else
bios_cpu_apicid[num_processors - found_bsp] = m->mpc_apicid; cpu = num_processors - found_bsp;
x86_cpu_to_apicid[num_processors - found_bsp] = m->mpc_apicid; bios_cpu_apicid[cpu] = m->mpc_apicid;
} x86_cpu_to_apicid[cpu] = m->mpc_apicid;
cpu_set(cpu, cpu_possible_map);
cpu_set(cpu, cpu_present_map);
} }
static void __init MP_bus_info (struct mpc_config_bus *m) static void __init MP_bus_info (struct mpc_config_bus *m)
......
...@@ -112,24 +112,6 @@ struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ; ...@@ -112,24 +112,6 @@ struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ;
#define get_idle_for_cpu(x) (idle_thread_array[(x)]) #define get_idle_for_cpu(x) (idle_thread_array[(x)])
#define set_idle_for_cpu(x,p) (idle_thread_array[(x)] = (p)) #define set_idle_for_cpu(x,p) (idle_thread_array[(x)] = (p))
/*
* cpu_possible_map should be static, it cannot change as cpu's
* are onlined, or offlined. The reason is per-cpu data-structures
* are allocated by some modules at init time, and dont expect to
* do this dynamically on cpu arrival/departure.
* cpu_present_map on the other hand can change dynamically.
* In case when cpu_hotplug is not compiled, then we resort to current
* behaviour, which is cpu_possible == cpu_present.
* If cpu-hotplug is supported, then we need to preallocate for all
* those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
* - Ashok Raj
*/
#ifdef CONFIG_HOTPLUG_CPU
#define fixup_cpu_possible_map(x) cpu_set((x), cpu_possible_map)
#else
#define fixup_cpu_possible_map(x)
#endif
/* /*
* Currently trivial. Write the real->protected mode * Currently trivial. Write the real->protected mode
* bootstrap into the page concerned. The caller * bootstrap into the page concerned. The caller
...@@ -924,6 +906,27 @@ static __init void enforce_max_cpus(unsigned max_cpus) ...@@ -924,6 +906,27 @@ static __init void enforce_max_cpus(unsigned max_cpus)
} }
} }
#ifdef CONFIG_HOTPLUG_CPU
/*
* cpu_possible_map should be static, it cannot change as cpu's
* are onlined, or offlined. The reason is per-cpu data-structures
* are allocated by some modules at init time, and dont expect to
* do this dynamically on cpu arrival/departure.
* cpu_present_map on the other hand can change dynamically.
* In case when cpu_hotplug is not compiled, then we resort to current
* behaviour, which is cpu_possible == cpu_present.
* If cpu-hotplug is supported, then we need to preallocate for all
* those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
* - Ashok Raj
*/
static void prefill_possible_map(void)
{
int i;
for (i = 0; i < NR_CPUS; i++)
cpu_set(i, cpu_possible_map);
}
#endif
/* /*
* Various sanity checks. * Various sanity checks.
*/ */
...@@ -987,25 +990,15 @@ static int __init smp_sanity_check(unsigned max_cpus) ...@@ -987,25 +990,15 @@ static int __init smp_sanity_check(unsigned max_cpus)
*/ */
void __init smp_prepare_cpus(unsigned int max_cpus) void __init smp_prepare_cpus(unsigned int max_cpus)
{ {
int i;
nmi_watchdog_default(); nmi_watchdog_default();
current_cpu_data = boot_cpu_data; current_cpu_data = boot_cpu_data;
current_thread_info()->cpu = 0; /* needed? */ current_thread_info()->cpu = 0; /* needed? */
enforce_max_cpus(max_cpus); enforce_max_cpus(max_cpus);
/* #ifdef CONFIG_HOTPLUG_CPU
* Fill in cpu_present_mask prefill_possible_map();
*/ #endif
for (i = 0; i < NR_CPUS; i++) {
int apicid = cpu_present_to_apicid(i);
if (physid_isset(apicid, phys_cpu_present_map)) {
cpu_set(i, cpu_present_map);
cpu_set(i, cpu_possible_map);
}
fixup_cpu_possible_map(i);
}
if (smp_sanity_check(max_cpus) < 0) { if (smp_sanity_check(max_cpus) < 0) {
printk(KERN_INFO "SMP disabled\n"); printk(KERN_INFO "SMP disabled\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment