aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64')
-rw-r--r--arch/sparc64/Kconfig1
-rw-r--r--arch/sparc64/kernel/setup.c2
-rw-r--r--arch/sparc64/kernel/smp.c28
3 files changed, 22 insertions, 9 deletions
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
index ab733be9af08..4c0a50a76554 100644
--- a/arch/sparc64/Kconfig
+++ b/arch/sparc64/Kconfig
@@ -383,6 +383,7 @@ source "arch/sparc64/oprofile/Kconfig"
383 383
384config KPROBES 384config KPROBES
385 bool "Kprobes (EXPERIMENTAL)" 385 bool "Kprobes (EXPERIMENTAL)"
386 depends on EXPERIMENTAL && MODULES
386 help 387 help
387 Kprobes allows you to trap at almost any kernel address and 388 Kprobes allows you to trap at almost any kernel address and
388 execute a callback function. register_kprobe() establishes 389 execute a callback function. register_kprobe() establishes
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c
index 054461e6946d..158bd31e15b7 100644
--- a/arch/sparc64/kernel/setup.c
+++ b/arch/sparc64/kernel/setup.c
@@ -542,6 +542,8 @@ void __init setup_arch(char **cmdline_p)
542 } 542 }
543#endif 543#endif
544 544
545 smp_setup_cpu_possible_map();
546
545 paging_init(); 547 paging_init();
546} 548}
547 549
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 1fb6323e65a4..1f7ad8a69052 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -1079,18 +1079,12 @@ int setup_profiling_timer(unsigned int multiplier)
1079 return 0; 1079 return 0;
1080} 1080}
1081 1081
1082/* Constrain the number of cpus to max_cpus. */
1082void __init smp_prepare_cpus(unsigned int max_cpus) 1083void __init smp_prepare_cpus(unsigned int max_cpus)
1083{ 1084{
1084 int instance, mid;
1085
1086 instance = 0;
1087 while (!cpu_find_by_instance(instance, NULL, &mid)) {
1088 if (mid < max_cpus)
1089 cpu_set(mid, phys_cpu_present_map);
1090 instance++;
1091 }
1092
1093 if (num_possible_cpus() > max_cpus) { 1085 if (num_possible_cpus() > max_cpus) {
1086 int instance, mid;
1087
1094 instance = 0; 1088 instance = 0;
1095 while (!cpu_find_by_instance(instance, NULL, &mid)) { 1089 while (!cpu_find_by_instance(instance, NULL, &mid)) {
1096 if (mid != boot_cpu_id) { 1090 if (mid != boot_cpu_id) {
@@ -1105,6 +1099,22 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
1105 smp_store_cpu_info(boot_cpu_id); 1099 smp_store_cpu_info(boot_cpu_id);
1106} 1100}
1107 1101
1102/* Set this up early so that things like the scheduler can init
1103 * properly. We use the same cpu mask for both the present and
1104 * possible cpu map.
1105 */
1106void __init smp_setup_cpu_possible_map(void)
1107{
1108 int instance, mid;
1109
1110 instance = 0;
1111 while (!cpu_find_by_instance(instance, NULL, &mid)) {
1112 if (mid < NR_CPUS)
1113 cpu_set(mid, phys_cpu_present_map);
1114 instance++;
1115 }
1116}
1117
1108void __devinit smp_prepare_boot_cpu(void) 1118void __devinit smp_prepare_boot_cpu(void)
1109{ 1119{
1110 if (hard_smp_processor_id() >= NR_CPUS) { 1120 if (hard_smp_processor_id() >= NR_CPUS) {