diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2005-02-10 12:00:06 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2005-10-29 19:30:30 +0100 |
commit | 57f0060b8a2bb2a70a4cce1a37d5e0158cea92a6 (patch) | |
tree | f2cca6d9bc63b4f180739e9f2a86db0f0e2d7d86 /arch/mips/kernel | |
parent | 26852d5cdb2bac01f2a48b815194a045e8a8e300 (diff) | |
download | blackbird-op-linux-57f0060b8a2bb2a70a4cce1a37d5e0158cea92a6.tar.gz blackbird-op-linux-57f0060b8a2bb2a70a4cce1a37d5e0158cea92a6.zip |
Document why calling smp_call_function will deadlock when called with
interrupts disabled.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/smp.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index af5cd3b8a396..1d3a4b501949 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c @@ -121,7 +121,19 @@ struct call_data_struct *call_data; * or are or have executed. * * You must not call this function with disabled interrupts or from a - * hardware interrupt handler or from a bottom half handler. + * hardware interrupt handler or from a bottom half handler: + * + * CPU A CPU B + * Disable interrupts + * smp_call_function() + * Take call_lock + * Send IPIs + * Wait for all cpus to acknowledge IPI + * CPU A has not responded, spin waiting + * for cpu A to respond, holding call_lock + * smp_call_function() + * Spin waiting for call_lock + * Deadlock Deadlock */ int smp_call_function (void (*func) (void *info), void *info, int retry, int wait) |