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

Commit d98e19cc authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

[S390] smp: external call vs. emergency signal



Use a sigp sense running to decide which signal processor order to use
for an ipi. If the target cpu is running use external call, if the target
cpu is not running use emergency signal.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 5915a873
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -92,7 +92,7 @@ ENTRY(_stext)
.LPG3:
.LPG3:
# check control registers
# check control registers
	stctl	%c0,%c15,0(%r15)
	stctl	%c0,%c15,0(%r15)
	oi	2(%r15),0x40		# enable sigp emergency signal
	oi	2(%r15),0x60		# enable sigp emergency & external call
	oi	0(%r15),0x10		# switch on low address protection
	oi	0(%r15),0x10		# switch on low address protection
	lctl	%c0,%c15,0(%r15)
	lctl	%c0,%c15,0(%r15)


+1 −1
Original line number Original line Diff line number Diff line
@@ -90,7 +90,7 @@ ENTRY(_stext)
.LPG3:
.LPG3:
# check control registers
# check control registers
	stctg	%c0,%c15,0(%r15)
	stctg	%c0,%c15,0(%r15)
	oi	6(%r15),0x40		# enable sigp emergency signal
	oi	6(%r15),0x60		# enable sigp emergency & external call
	oi	4(%r15),0x10		# switch on low address proctection
	oi	4(%r15),0x10		# switch on low address proctection
	lctlg	%c0,%c15,0(%r15)
	lctlg	%c0,%c15,0(%r15)


+11 −1
Original line number Original line Diff line number Diff line
@@ -209,13 +209,20 @@ static void do_ext_call_interrupt(unsigned int ext_int_code,
 */
 */
static void smp_ext_bitcall(int cpu, int sig)
static void smp_ext_bitcall(int cpu, int sig)
{
{
	int order;

	/*
	/*
	 * Set signaling bit in lowcore of target cpu and kick it
	 * Set signaling bit in lowcore of target cpu and kick it
	 */
	 */
	set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast);
	set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast);
	while (sigp(cpu, sigp_emergency_signal) == sigp_busy)
	while (1) {
		order = smp_vcpu_scheduled(cpu) ?
			sigp_external_call : sigp_emergency_signal;
		if (sigp(cpu, order) != sigp_busy)
			break;
		udelay(10);
		udelay(10);
	}
	}
}


void arch_send_call_function_ipi_mask(const struct cpumask *mask)
void arch_send_call_function_ipi_mask(const struct cpumask *mask)
{
{
@@ -754,6 +761,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
	/* request the 0x1201 emergency signal external interrupt */
	/* request the 0x1201 emergency signal external interrupt */
	if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0)
	if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0)
		panic("Couldn't request external interrupt 0x1201");
		panic("Couldn't request external interrupt 0x1201");
	/* request the 0x1202 external call external interrupt */
	if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0)
		panic("Couldn't request external interrupt 0x1202");


	/* Reallocate current lowcore, but keep its contents. */
	/* Reallocate current lowcore, but keep its contents. */
	lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);
	lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);