Skip to content

Commit b36eb5e

Browse files
committed
ipmi: Disable some operations during a panic
Don't do kfree or other risky things when oops_in_progress is set. It's easy enough to avoid doing them Signed-off-by: Corey Minyard <[email protected]>
1 parent db05ddf commit b36eb5e

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

drivers/char/ipmi/ipmi_msghandler.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4789,7 +4789,9 @@ static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0);
47894789
static void free_smi_msg(struct ipmi_smi_msg *msg)
47904790
{
47914791
atomic_dec(&smi_msg_inuse_count);
4792-
kfree(msg);
4792+
/* Try to keep as much stuff out of the panic path as possible. */
4793+
if (!oops_in_progress)
4794+
kfree(msg);
47934795
}
47944796

47954797
struct ipmi_smi_msg *ipmi_alloc_smi_msg(void)
@@ -4808,7 +4810,9 @@ EXPORT_SYMBOL(ipmi_alloc_smi_msg);
48084810
static void free_recv_msg(struct ipmi_recv_msg *msg)
48094811
{
48104812
atomic_dec(&recv_msg_inuse_count);
4811-
kfree(msg);
4813+
/* Try to keep as much stuff out of the panic path as possible. */
4814+
if (!oops_in_progress)
4815+
kfree(msg);
48124816
}
48134817

48144818
static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
@@ -4826,7 +4830,7 @@ static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
48264830

48274831
void ipmi_free_recv_msg(struct ipmi_recv_msg *msg)
48284832
{
4829-
if (msg->user)
4833+
if (msg->user && !oops_in_progress)
48304834
kref_put(&msg->user->refcount, free_user);
48314835
msg->done(msg);
48324836
}

drivers/char/ipmi/ipmi_watchdog.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,13 +342,17 @@ static atomic_t msg_tofree = ATOMIC_INIT(0);
342342
static DECLARE_COMPLETION(msg_wait);
343343
static void msg_free_smi(struct ipmi_smi_msg *msg)
344344
{
345-
if (atomic_dec_and_test(&msg_tofree))
346-
complete(&msg_wait);
345+
if (atomic_dec_and_test(&msg_tofree)) {
346+
if (!oops_in_progress)
347+
complete(&msg_wait);
348+
}
347349
}
348350
static void msg_free_recv(struct ipmi_recv_msg *msg)
349351
{
350-
if (atomic_dec_and_test(&msg_tofree))
351-
complete(&msg_wait);
352+
if (atomic_dec_and_test(&msg_tofree)) {
353+
if (!oops_in_progress)
354+
complete(&msg_wait);
355+
}
352356
}
353357
static struct ipmi_smi_msg smi_msg = {
354358
.done = msg_free_smi
@@ -434,8 +438,10 @@ static int _ipmi_set_timeout(int do_heartbeat)
434438
rv = __ipmi_set_timeout(&smi_msg,
435439
&recv_msg,
436440
&send_heartbeat_now);
437-
if (rv)
441+
if (rv) {
442+
atomic_set(&msg_tofree, 0);
438443
return rv;
444+
}
439445

440446
wait_for_completion(&msg_wait);
441447

@@ -580,6 +586,7 @@ static int __ipmi_heartbeat(void)
580586
&recv_msg,
581587
1);
582588
if (rv) {
589+
atomic_set(&msg_tofree, 0);
583590
pr_warn("heartbeat send failure: %d\n", rv);
584591
return rv;
585592
}

0 commit comments

Comments
 (0)