mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 17:59:32 +00:00
[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: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
70f5dc514c
commit
f8501ba77d
3 changed files with 6 additions and 6 deletions
|
@ -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)
|
||||||
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:
|
||||||
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:
|
||||||
|
|
Loading…
Reference in a new issue