diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2006-12-04 09:40:33 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-12-04 09:40:33 -0500 |
commit | c6b5b847a7cf11f131c43fe0041443ec11697fc7 (patch) | |
tree | d15fb7302bd446394ab373128be0a77826566e30 /arch/s390/kernel/ipl.c | |
parent | 740b5706b9c4b3767f597b3ea76654c6f2a800b2 (diff) |
[S390] cpu shutdown rework
Let one master cpu kill all other cpus instead of sending an external
interrupt to all other cpus so they can kill themselves.
Simplifies reipl/shutdown functions a lot.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/ipl.c')
-rw-r--r-- | arch/s390/kernel/ipl.c | 24 |
1 files changed, 2 insertions, 22 deletions
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index 101b003cfabf..a36bea1188d9 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c | |||
@@ -576,23 +576,6 @@ static struct subsys_attribute dump_type_attr = | |||
576 | 576 | ||
577 | static decl_subsys(dump, NULL, NULL); | 577 | static decl_subsys(dump, NULL, NULL); |
578 | 578 | ||
579 | #ifdef CONFIG_SMP | ||
580 | static void dump_smp_stop_all(void) | ||
581 | { | ||
582 | int cpu; | ||
583 | preempt_disable(); | ||
584 | for_each_online_cpu(cpu) { | ||
585 | if (cpu == smp_processor_id()) | ||
586 | continue; | ||
587 | while (signal_processor(cpu, sigp_stop) == sigp_busy) | ||
588 | udelay(10); | ||
589 | } | ||
590 | preempt_enable(); | ||
591 | } | ||
592 | #else | ||
593 | #define dump_smp_stop_all() do { } while (0) | ||
594 | #endif | ||
595 | |||
596 | /* | 579 | /* |
597 | * Shutdown actions section | 580 | * Shutdown actions section |
598 | */ | 581 | */ |
@@ -724,13 +707,13 @@ static void do_dump(void) | |||
724 | 707 | ||
725 | switch (dump_method) { | 708 | switch (dump_method) { |
726 | case IPL_METHOD_CCW_CIO: | 709 | case IPL_METHOD_CCW_CIO: |
727 | dump_smp_stop_all(); | 710 | smp_send_stop(); |
728 | devid.devno = dump_block_ccw->ipl_info.ccw.devno; | 711 | devid.devno = dump_block_ccw->ipl_info.ccw.devno; |
729 | devid.ssid = 0; | 712 | devid.ssid = 0; |
730 | reipl_ccw_dev(&devid); | 713 | reipl_ccw_dev(&devid); |
731 | break; | 714 | break; |
732 | case IPL_METHOD_CCW_VM: | 715 | case IPL_METHOD_CCW_VM: |
733 | dump_smp_stop_all(); | 716 | smp_send_stop(); |
734 | sprintf(buf, "STORE STATUS"); | 717 | sprintf(buf, "STORE STATUS"); |
735 | __cpcmd(buf, NULL, 0, NULL); | 718 | __cpcmd(buf, NULL, 0, NULL); |
736 | sprintf(buf, "IPL %X", dump_block_ccw->ipl_info.ccw.devno); | 719 | sprintf(buf, "IPL %X", dump_block_ccw->ipl_info.ccw.devno); |
@@ -1059,9 +1042,6 @@ void s390_reset_system(void) | |||
1059 | { | 1042 | { |
1060 | struct _lowcore *lc; | 1043 | struct _lowcore *lc; |
1061 | 1044 | ||
1062 | /* Disable all interrupts/machine checks */ | ||
1063 | __load_psw_mask(PSW_KERNEL_BITS & ~PSW_MASK_MCHECK); | ||
1064 | |||
1065 | /* Stack for interrupt/machine check handler */ | 1045 | /* Stack for interrupt/machine check handler */ |
1066 | lc = (struct _lowcore *)(unsigned long) store_prefix(); | 1046 | lc = (struct _lowcore *)(unsigned long) store_prefix(); |
1067 | lc->panic_stack = S390_lowcore.panic_stack; | 1047 | lc->panic_stack = S390_lowcore.panic_stack; |