[PATCH] smp_call_function_single() check that local interrupts are enabled
smp_call_function_single() can deadlock if the caller disabled local interrupts (the target CPU could be spinning on call_lock). Check for that. Why on earth do these functions use spin_lock_bh()?? Cc: "Randy.Dunlap" <rdunlap@xenotime.net> Cc: Andi Kleen <ak@suse.de> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
83df8db9e6
commit
a38a44c1a9
|
@ -699,6 +699,10 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
|
||||||
put_cpu();
|
put_cpu();
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Can deadlock when called with interrupts disabled */
|
||||||
|
WARN_ON(irqs_disabled());
|
||||||
|
|
||||||
spin_lock_bh(&call_lock);
|
spin_lock_bh(&call_lock);
|
||||||
__smp_call_function_single(cpu, func, info, nonatomic, wait);
|
__smp_call_function_single(cpu, func, info, nonatomic, wait);
|
||||||
spin_unlock_bh(&call_lock);
|
spin_unlock_bh(&call_lock);
|
||||||
|
|
|
@ -379,6 +379,10 @@ int smp_call_function_single (int cpu, void (*func) (void *info), void *info,
|
||||||
put_cpu();
|
put_cpu();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Can deadlock when called with interrupts disabled */
|
||||||
|
WARN_ON(irqs_disabled());
|
||||||
|
|
||||||
spin_lock_bh(&call_lock);
|
spin_lock_bh(&call_lock);
|
||||||
__smp_call_function_single(cpu, func, info, nonatomic, wait);
|
__smp_call_function_single(cpu, func, info, nonatomic, wait);
|
||||||
spin_unlock_bh(&call_lock);
|
spin_unlock_bh(&call_lock);
|
||||||
|
|
Loading…
Reference in New Issue