Commit f213e550 authored by Heiko Carstens's avatar Heiko Carstens Committed by Vasily Gorbik

s390/smp: smp_emergency_stop() - move cpumask away from stack

Make "cpumask_t cpumask" a static variable to avoid a potential large
stack frame. Also protect against potential concurrent callers by
introducing a local lock.
Note: smp_emergency_stop() gets only called with irqs and machine
checks disabled, therefore a cpu local deadlock is not possible. For
concurrent callers the first cpu which enters the critical section
wins and will stop all other cpus.
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 62c8dca9
...@@ -434,10 +434,12 @@ void notrace smp_yield_cpu(int cpu) ...@@ -434,10 +434,12 @@ void notrace smp_yield_cpu(int cpu)
*/ */
void notrace smp_emergency_stop(void) void notrace smp_emergency_stop(void)
{ {
cpumask_t cpumask; static arch_spinlock_t lock = __ARCH_SPIN_LOCK_UNLOCKED;
static cpumask_t cpumask;
u64 end; u64 end;
int cpu; int cpu;
arch_spin_lock(&lock);
cpumask_copy(&cpumask, cpu_online_mask); cpumask_copy(&cpumask, cpu_online_mask);
cpumask_clear_cpu(smp_processor_id(), &cpumask); cpumask_clear_cpu(smp_processor_id(), &cpumask);
...@@ -458,6 +460,7 @@ void notrace smp_emergency_stop(void) ...@@ -458,6 +460,7 @@ void notrace smp_emergency_stop(void)
break; break;
cpu_relax(); cpu_relax();
} }
arch_spin_unlock(&lock);
} }
NOKPROBE_SYMBOL(smp_emergency_stop); NOKPROBE_SYMBOL(smp_emergency_stop);
......
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