Skip to content

Commit e7c46c6

Browse files
heicarstMartin Schwidefsky
authored and
Martin Schwidefsky
committed
s390/smp: fix smp_stop_cpu() for !CONFIG_SMP
smp_stop_cpu() should stop the current cpu even for !CONFIG_SMP. Otherwise machine_halt() will return and and the machine generates a panic instread of simply stopping the current cpu: Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000 CPU: 0 PID: 1 Comm: systemd-shutdow Not tainted 3.14.0-01527-g2b6ef16a6bc5 #10 [...] Call Trace: ([<0000000000110db0>] show_trace+0xf8/0x158) [<0000000000110e7a>] show_stack+0x6a/0xe8 [<000000000074dba8>] panic+0xe4/0x268 [<0000000000140570>] do_exit+0xa88/0xb2c [<000000000016e12c>] SyS_reboot+0x1f0/0x234 [<000000000075da70>] sysc_nr_ok+0x22/0x28 [<000000007d5a09b4>] 0x7d5a09b4 Signed-off-by: Heiko Carstens <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]>
1 parent a8a934e commit e7c46c6

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

arch/s390/include/asm/sigp.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,23 @@
3131
#define SIGP_STATUS_INCORRECT_STATE 0x00000200UL
3232
#define SIGP_STATUS_NOT_RUNNING 0x00000400UL
3333

34+
#ifndef __ASSEMBLY__
35+
36+
static inline int __pcpu_sigp(u16 addr, u8 order, u32 parm, u32 *status)
37+
{
38+
register unsigned int reg1 asm ("1") = parm;
39+
int cc;
40+
41+
asm volatile(
42+
" sigp %1,%2,0(%3)\n"
43+
" ipm %0\n"
44+
" srl %0,28\n"
45+
: "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc");
46+
if (status && cc == 1)
47+
*status = reg1;
48+
return cc;
49+
}
50+
51+
#endif /* __ASSEMBLY__ */
52+
3453
#endif /* __S390_ASM_SIGP_H */

arch/s390/include/asm/smp.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#ifndef __ASM_SMP_H
88
#define __ASM_SMP_H
99

10+
#include <asm/sigp.h>
11+
1012
#ifdef CONFIG_SMP
1113

1214
#include <asm/lowcore.h>
@@ -50,9 +52,18 @@ static inline int smp_store_status(int cpu) { return 0; }
5052
static inline int smp_vcpu_scheduled(int cpu) { return 1; }
5153
static inline void smp_yield_cpu(int cpu) { }
5254
static inline void smp_yield(void) { }
53-
static inline void smp_stop_cpu(void) { }
5455
static inline void smp_fill_possible_mask(void) { }
5556

57+
static inline void smp_stop_cpu(void)
58+
{
59+
u16 pcpu = stap();
60+
61+
for (;;) {
62+
__pcpu_sigp(pcpu, SIGP_STOP, 0, NULL);
63+
cpu_relax();
64+
}
65+
}
66+
5667
#endif /* CONFIG_SMP */
5768

5869
#ifdef CONFIG_HOTPLUG_CPU

arch/s390/kernel/smp.c

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,21 +82,6 @@ DEFINE_MUTEX(smp_cpu_state_mutex);
8282
/*
8383
* Signal processor helper functions.
8484
*/
85-
static inline int __pcpu_sigp(u16 addr, u8 order, u32 parm, u32 *status)
86-
{
87-
register unsigned int reg1 asm ("1") = parm;
88-
int cc;
89-
90-
asm volatile(
91-
" sigp %1,%2,0(%3)\n"
92-
" ipm %0\n"
93-
" srl %0,28\n"
94-
: "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc");
95-
if (status && cc == 1)
96-
*status = reg1;
97-
return cc;
98-
}
99-
10085
static inline int __pcpu_sigp_relax(u16 addr, u8 order, u32 parm, u32 *status)
10186
{
10287
int cc;

0 commit comments

Comments
 (0)