Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / arch / s390 / kernel / smp.c
index 53291e9..8e03219 100644 (file)
@@ -665,7 +665,9 @@ __cpu_up(unsigned int cpu)
         cpu_lowcore->current_task = (unsigned long) idle;
         cpu_lowcore->cpu_data.cpu_nr = cpu;
        eieio();
-       signal_processor(cpu,sigp_restart);
+
+       while (signal_processor(cpu,sigp_restart) == sigp_busy)
+               udelay(10);
 
        while (!cpu_online(cpu))
                cpu_relax();
@@ -673,20 +675,25 @@ __cpu_up(unsigned int cpu)
 }
 
 static unsigned int __initdata additional_cpus;
+static unsigned int __initdata possible_cpus;
 
 void __init smp_setup_cpu_possible_map(void)
 {
-       unsigned int pcpus, cpu;
+       unsigned int phy_cpus, pos_cpus, cpu;
 
-       pcpus = smp_count_cpus() + additional_cpus;
+       phy_cpus = smp_count_cpus();
+       pos_cpus = min(phy_cpus + additional_cpus, (unsigned int) NR_CPUS);
 
-       if (pcpus > NR_CPUS)
-               pcpus = NR_CPUS;
+       if (possible_cpus)
+               pos_cpus = min(possible_cpus, (unsigned int) NR_CPUS);
 
-       for (cpu = 0; cpu < pcpus; cpu++)
+       for (cpu = 0; cpu < pos_cpus; cpu++)
                cpu_set(cpu, cpu_possible_map);
 
-       cpu_present_map = cpu_possible_map;
+       phy_cpus = min(phy_cpus, pos_cpus);
+
+       for (cpu = 0; cpu < phy_cpus; cpu++)
+               cpu_set(cpu, cpu_present_map);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -698,6 +705,13 @@ static int __init setup_additional_cpus(char *s)
 }
 early_param("additional_cpus", setup_additional_cpus);
 
+static int __init setup_possible_cpus(char *s)
+{
+       possible_cpus = simple_strtoul(s, NULL, 0);
+       return 0;
+}
+early_param("possible_cpus", setup_possible_cpus);
+
 int
 __cpu_disable(void)
 {
@@ -787,9 +801,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
          */
        print_cpu_info(&S390_lowcore.cpu_data);
 
-        for(i = 0; i < NR_CPUS; i++) {
-               if (!cpu_possible(i))
-                       continue;
+        for_each_possible_cpu(i) {
                lowcore_ptr[i] = (struct _lowcore *)
                        __get_free_pages(GFP_KERNEL|GFP_DMA, 
                                        sizeof(void*) == 8 ? 1 : 0);
@@ -819,7 +831,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 #endif
        set_prefix((u32)(unsigned long) lowcore_ptr[smp_processor_id()]);
 
-       for_each_cpu(cpu)
+       for_each_possible_cpu(cpu)
                if (cpu != smp_processor_id())
                        smp_create_idle(cpu);
 }
@@ -835,6 +847,7 @@ void __devinit smp_prepare_boot_cpu(void)
 
 void smp_cpus_done(unsigned int max_cpus)
 {
+       cpu_present_map = cpu_possible_map;
 }
 
 /*
@@ -855,8 +868,8 @@ static int __init topology_init(void)
        int cpu;
        int ret;
 
-       for_each_cpu(cpu) {
-               ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, NULL);
+       for_each_possible_cpu(cpu) {
+               ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu);
                if (ret)
                        printk(KERN_WARNING "topology_init: register_cpu %d "
                               "failed (%d)\n", cpu, ret);