Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / drivers / s390 / char / sclp_quiesce.c
index 924c5dc..32004aa 100644 (file)
@@ -7,12 +7,12 @@
  *             Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/cpumask.h>
 #include <linux/smp.h>
 #include <linux/init.h>
+#include <linux/reboot.h>
 #include <asm/atomic.h>
 #include <asm/ptrace.h>
 #include <asm/sigp.h>
@@ -30,31 +30,16 @@ do_load_quiesce_psw(void * __unused)
 {
        static atomic_t cpuid = ATOMIC_INIT(-1);
        psw_t quiesce_psw;
-       __u32 status;
-       int i;
+       int cpu;
 
-       if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid))
+       if (atomic_cmpxchg(&cpuid, -1, smp_processor_id()) != -1)
                signal_processor(smp_processor_id(), sigp_stop);
        /* Wait for all other cpus to enter stopped state */
-       i = 1;
-       while (i < NR_CPUS) {
-               if (!cpu_online(i)) {
-                       i++;
+       for_each_online_cpu(cpu) {
+               if (cpu == smp_processor_id())
                        continue;
-               }
-               switch (signal_processor_ps(&status, 0, i, sigp_sense)) {
-               case sigp_order_code_accepted:
-               case sigp_status_stored:
-                       /* Check for stopped and check stop state */
-                       if (status & 0x50)
-                               i++;
-                       break;
-               case sigp_busy:
-                       break;
-               case sigp_not_operational:
-                       i++;
-                       break;
-               }
+               while(!smp_cpu_not_running(cpu))
+                       cpu_relax();
        }
        /* Quiesce the last cpu with the special psw */
        quiesce_psw.mask = PSW_BASE_BITS | PSW_MASK_WAIT;
@@ -81,8 +66,6 @@ do_machine_quiesce(void)
 }
 #endif
 
-extern void ctrl_alt_del(void);
-
 /* Handler for quiesce event. Start shutdown procedure. */
 static void
 sclp_quiesce_handler(struct evbuf_header *evbuf)