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: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
62c8dca9e1
commit
f213e5502d
@ -434,10 +434,12 @@ void notrace smp_yield_cpu(int cpu)
|
||||
*/
|
||||
void notrace smp_emergency_stop(void)
|
||||
{
|
||||
cpumask_t cpumask;
|
||||
static arch_spinlock_t lock = __ARCH_SPIN_LOCK_UNLOCKED;
|
||||
static cpumask_t cpumask;
|
||||
u64 end;
|
||||
int cpu;
|
||||
|
||||
arch_spin_lock(&lock);
|
||||
cpumask_copy(&cpumask, cpu_online_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &cpumask);
|
||||
|
||||
@ -458,6 +460,7 @@ void notrace smp_emergency_stop(void)
|
||||
break;
|
||||
cpu_relax();
|
||||
}
|
||||
arch_spin_unlock(&lock);
|
||||
}
|
||||
NOKPROBE_SYMBOL(smp_emergency_stop);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user