* 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>
{
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;
}
#endif
-extern void ctrl_alt_del(void);
-
/* Handler for quiesce event. Start shutdown procedure. */
static void
sclp_quiesce_handler(struct evbuf_header *evbuf)