Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -1595,11 +1595,10 @@ static void stop_run(struct shutdown_trigger *trigger)
{
	if (strcmp(trigger->name, ON_PANIC_STR) == 0)
		disabled_wait((unsigned long) __builtin_return_address(0));
	else {
		signal_processor(smp_processor_id(), sigp_stop);
	while (signal_processor(smp_processor_id(), sigp_stop) == sigp_busy)
		cpu_relax();
	for (;;);
}
}

static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR,
					     stop_run, NULL};
+2 −2
Original line number Diff line number Diff line
@@ -647,8 +647,8 @@ void __cpu_die(unsigned int cpu)
void cpu_die(void)
{
	idle_task_exit();
	signal_processor(smp_processor_id(), sigp_stop);
	BUG();
	while (signal_processor(smp_processor_id(), sigp_stop) == sigp_busy)
		cpu_relax();
	for (;;);
}

+1 −0
Original line number Diff line number Diff line
@@ -199,6 +199,7 @@ pgm_check_entry:
	brc	2,4b			/* busy, try again */
5:
	sigp	%r9,%r2,__SIGP_STOP	/* stop resume (current) CPU */
	brc	2,5b			/* busy, try again */
6:	j	6b

restart_suspend: