diff options
author | Konstantin Baydarov <kbaidarov@ru.mvista.com> | 2008-04-29 04:01:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:14 -0400 |
commit | 5956dce1485efe3816febc24aa52490dcb2be837 (patch) | |
tree | 292231b7783baaf980a65eacb199a0384446f566 /drivers/char/ipmi/ipmi_si_intf.c | |
parent | bda4c30aa6f7dc1483f39ea1dfe37bcab8a96207 (diff) |
ipmi: don't grab locks in run-to-completion mode
This patch prevents deadlocks in IPMI panic handler caused by msg_lock
in smi_info structure and waiting_msgs_lock in ipmi_smi structure.
[cminyard@mvista.com: remove unnecessary memory barriers]
Signed-off-by: Konstantin Baydarov <kbaidarov@ru.mvista.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/ipmi/ipmi_si_intf.c')
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 30f535657342..657034febdaf 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -289,7 +289,8 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info) | |||
289 | 289 | ||
290 | /* No need to save flags, we aleady have interrupts off and we | 290 | /* No need to save flags, we aleady have interrupts off and we |
291 | already hold the SMI lock. */ | 291 | already hold the SMI lock. */ |
292 | spin_lock(&(smi_info->msg_lock)); | 292 | if (!smi_info->run_to_completion) |
293 | spin_lock(&(smi_info->msg_lock)); | ||
293 | 294 | ||
294 | /* Pick the high priority queue first. */ | 295 | /* Pick the high priority queue first. */ |
295 | if (!list_empty(&(smi_info->hp_xmit_msgs))) { | 296 | if (!list_empty(&(smi_info->hp_xmit_msgs))) { |
@@ -329,7 +330,8 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info) | |||
329 | rv = SI_SM_CALL_WITHOUT_DELAY; | 330 | rv = SI_SM_CALL_WITHOUT_DELAY; |
330 | } | 331 | } |
331 | out: | 332 | out: |
332 | spin_unlock(&(smi_info->msg_lock)); | 333 | if (!smi_info->run_to_completion) |
334 | spin_unlock(&(smi_info->msg_lock)); | ||
333 | 335 | ||
334 | return rv; | 336 | return rv; |
335 | } | 337 | } |