]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[SPARC]: Setup cpu_possible_map
authorBob Breuer <breuerr@mc.net>
Tue, 20 Jun 2006 07:30:31 +0000 (00:30 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Jun 2006 07:30:31 +0000 (00:30 -0700)
Setup cpu_possible_map so the secondary cpus will get started.

Signed-off-by: Bob Breuer <breuerr@mc.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/setup.c
arch/sparc/kernel/smp.c
include/asm-sparc/smp.h

index 8531a8e158323f54117877cbacdb78c277a3f244..2cbf282f0d004d9bdf2813b043fffa0f0e1f096d 100644 (file)
@@ -349,6 +349,8 @@ void __init setup_arch(char **cmdline_p)
        init_mm.context = (unsigned long) NO_CONTEXT;
        init_task.thread.kregs = &fake_swapper_regs;
 
+       smp_setup_cpu_possible_map();
+
        paging_init();
 }
 
index 40b42c88e6a7876c09598e93d30df54def747338..d0ccb8ad1d54cc8967bcb06bf76165ed10ab4f27 100644 (file)
@@ -267,22 +267,18 @@ int setup_profiling_timer(unsigned int multiplier)
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
        extern void smp4m_boot_cpus(void);
-       int i, cpuid, ncpus, extra;
+       int i, cpuid, extra;
 
        BUG_ON(sparc_cpu_model != sun4m);
        printk("Entering SMP Mode...\n");
 
-       ncpus = 1;
        extra = 0;
        for (i = 0; !cpu_find_by_instance(i, NULL, &cpuid); i++) {
-               if (cpuid == boot_cpu_id)
-                       continue;
-               if (cpuid < NR_CPUS && ncpus++ < max_cpus)
-                       cpu_set(cpuid, phys_cpu_present_map);
-               else
+               if (cpuid >= NR_CPUS)
                        extra++;
        }
-       if (max_cpus >= NR_CPUS && extra)
+       /* i = number of cpus */
+       if (extra && max_cpus > i - extra)
                printk("Warning: NR_CPUS is too low to start all cpus\n");
 
        smp_store_cpu_info(boot_cpu_id);
@@ -290,6 +286,24 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
        smp4m_boot_cpus();
 }
 
+/* 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);
+                       cpu_set(mid, cpu_present_map);
+               }
+               instance++;
+       }
+}
+
 void __devinit smp_prepare_boot_cpu(void)
 {
        int cpuid = hard_smp_processor_id();
index 98c46e3fbe8a2faae8bb92f3e2d66889a624f9da..c1a289327a79eb340ec669682c314af8b0cd5d63 100644 (file)
@@ -146,6 +146,8 @@ static inline int hard_smp_processor_id(void)
 #define prof_multiplier(__cpu)         cpu_data(__cpu).multiplier
 #define prof_counter(__cpu)            cpu_data(__cpu).counter
 
+void smp_setup_cpu_possible_map(void);
+
 #endif /* !(__ASSEMBLY__) */
 
 /* Sparc specific messages. */
@@ -162,7 +164,11 @@ static inline int hard_smp_processor_id(void)
 #define MBOX_IDLECPU2         0xFD
 #define MBOX_STOPCPU2         0xFE
 
-#endif /* SMP */
+#else /* SMP */
+
+#define smp_setup_cpu_possible_map() do { } while (0)
+
+#endif /* !(SMP) */
 
 #define NO_PROC_ID            0xFF