[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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
043df59eb3
commit
7abea92145
@ -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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
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) {
|
if (num_possible_cpus() > max_cpus) {
|
||||||
|
int instance, mid;
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
#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
|
||||||
|
Loading…
Reference in New Issue
Block a user