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 Original line 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)
	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,
					     stop_run, NULL};
					     stop_run, NULL};
+2 −2
Original line number Original line Diff line number Diff line
@@ -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 (;;);
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -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: