aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/ipmi/ipmi_si_intf.c
diff options
context:
space:
mode:
authorKonstantin Baydarov <kbaidarov@ru.mvista.com>2008-04-29 04:01:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-29 11:06:14 -0400
commit5956dce1485efe3816febc24aa52490dcb2be837 (patch)
tree292231b7783baaf980a65eacb199a0384446f566 /drivers/char/ipmi/ipmi_si_intf.c
parentbda4c30aa6f7dc1483f39ea1dfe37bcab8a96207 (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.c6
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}