Commit f8501ba7 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

[S390] smp: fix sigp stop handling

According to the architecture a cpu must not necessarily enter stopped
state after completion of a sigp instruction with "stop" order code.
So remove the BUG() statement after self sending sigp stop to avoid
that it ever gets reached.
Also add a sigp busy check to make sure that the order gets delivered.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 70f5dc51
...@@ -1595,10 +1595,9 @@ static void stop_run(struct shutdown_trigger *trigger) ...@@ -1595,10 +1595,9 @@ static void stop_run(struct shutdown_trigger *trigger)
{ {
if (strcmp(trigger->name, ON_PANIC_STR) == 0) if (strcmp(trigger->name, ON_PANIC_STR) == 0)
disabled_wait((unsigned long) __builtin_return_address(0)); disabled_wait((unsigned long) __builtin_return_address(0));
else { while (signal_processor(smp_processor_id(), sigp_stop) == sigp_busy)
signal_processor(smp_processor_id(), sigp_stop); cpu_relax();
for (;;); for (;;);
}
} }
static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR, static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR,
......
...@@ -647,8 +647,8 @@ void __cpu_die(unsigned int cpu) ...@@ -647,8 +647,8 @@ void __cpu_die(unsigned int cpu)
void cpu_die(void) void cpu_die(void)
{ {
idle_task_exit(); idle_task_exit();
signal_processor(smp_processor_id(), sigp_stop); while (signal_processor(smp_processor_id(), sigp_stop) == sigp_busy)
BUG(); cpu_relax();
for (;;); for (;;);
} }
......
...@@ -199,6 +199,7 @@ pgm_check_entry: ...@@ -199,6 +199,7 @@ pgm_check_entry:
brc 2,4b /* busy, try again */ brc 2,4b /* busy, try again */
5: 5:
sigp %r9,%r2,__SIGP_STOP /* stop resume (current) CPU */ sigp %r9,%r2,__SIGP_STOP /* stop resume (current) CPU */
brc 2,5b /* busy, try again */
6: j 6b 6: j 6b
restart_suspend: restart_suspend:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment