Commit 7abea921 authored by David S. Miller's avatar David S. Miller

[SPARC64]: Make cpu_present_map available earlier.

The change to kernel/sched.c's init code to use for_each_cpu()
requires that the cpu_possible_map be setup much earlier.

Set it up via setup_arch(), constrained to NR_CPUS, and later
constrain it to max_cpus in smp_prepare_cpus().

This fixes SMP booting on sparc64.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 043df59e
...@@ -542,6 +542,8 @@ void __init setup_arch(char **cmdline_p) ...@@ -542,6 +542,8 @@ void __init setup_arch(char **cmdline_p)
} }
#endif #endif
smp_setup_cpu_possible_map();
paging_init(); paging_init();
} }
......
...@@ -1079,18 +1079,12 @@ int setup_profiling_timer(unsigned int multiplier) ...@@ -1079,18 +1079,12 @@ int setup_profiling_timer(unsigned int multiplier)
return 0; return 0;
} }
/* Constrain the number of cpus to max_cpus. */
void __init smp_prepare_cpus(unsigned int max_cpus) void __init smp_prepare_cpus(unsigned int max_cpus)
{ {
if (num_possible_cpus() > max_cpus) {
int instance, mid; int instance, mid;
instance = 0;
while (!cpu_find_by_instance(instance, NULL, &mid)) {
if (mid < max_cpus)
cpu_set(mid, phys_cpu_present_map);
instance++;
}
if (num_possible_cpus() > max_cpus) {
instance = 0; instance = 0;
while (!cpu_find_by_instance(instance, NULL, &mid)) { while (!cpu_find_by_instance(instance, NULL, &mid)) {
if (mid != boot_cpu_id) { if (mid != boot_cpu_id) {
...@@ -1105,6 +1099,22 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -1105,6 +1099,22 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
smp_store_cpu_info(boot_cpu_id); smp_store_cpu_info(boot_cpu_id);
} }
/* Set this up early so that things like the scheduler can init
* properly. We use the same cpu mask for both the present and
* possible cpu map.
*/
void __init smp_setup_cpu_possible_map(void)
{
int instance, mid;
instance = 0;
while (!cpu_find_by_instance(instance, NULL, &mid)) {
if (mid < NR_CPUS)
cpu_set(mid, phys_cpu_present_map);
instance++;
}
}
void __devinit smp_prepare_boot_cpu(void) void __devinit smp_prepare_boot_cpu(void)
{ {
if (hard_smp_processor_id() >= NR_CPUS) { if (hard_smp_processor_id() >= NR_CPUS) {
......
...@@ -66,8 +66,14 @@ static __inline__ int hard_smp_processor_id(void) ...@@ -66,8 +66,14 @@ static __inline__ int hard_smp_processor_id(void)
#define raw_smp_processor_id() (current_thread_info()->cpu) #define raw_smp_processor_id() (current_thread_info()->cpu)
extern void smp_setup_cpu_possible_map(void);
#endif /* !(__ASSEMBLY__) */ #endif /* !(__ASSEMBLY__) */
#else
#define smp_setup_cpu_possible_map() do { } while (0)
#endif /* !(CONFIG_SMP) */ #endif /* !(CONFIG_SMP) */
#define NO_PROC_ID 0xFF #define NO_PROC_ID 0xFF
......
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