···47894789static void free_smi_msg(struct ipmi_smi_msg *msg)47904790{47914791 atomic_dec(&smi_msg_inuse_count);47924792- kfree(msg);47924792+ /* Try to keep as much stuff out of the panic path as possible. */47934793+ if (!oops_in_progress)47944794+ kfree(msg);47934795}4794479647954797struct ipmi_smi_msg *ipmi_alloc_smi_msg(void)···48104808static void free_recv_msg(struct ipmi_recv_msg *msg)48114809{48124810 atomic_dec(&recv_msg_inuse_count);48134813- kfree(msg);48114811+ /* Try to keep as much stuff out of the panic path as possible. */48124812+ if (!oops_in_progress)48134813+ kfree(msg);48144814}4815481548164816static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)···4830482648314827void ipmi_free_recv_msg(struct ipmi_recv_msg *msg)48324828{48334833- if (msg->user)48294829+ if (msg->user && !oops_in_progress)48344830 kref_put(&msg->user->refcount, free_user);48354831 msg->done(msg);48364832}
+12-5
drivers/char/ipmi/ipmi_watchdog.c
···342342static DECLARE_COMPLETION(msg_wait);343343static void msg_free_smi(struct ipmi_smi_msg *msg)344344{345345- if (atomic_dec_and_test(&msg_tofree))346346- complete(&msg_wait);345345+ if (atomic_dec_and_test(&msg_tofree)) {346346+ if (!oops_in_progress)347347+ complete(&msg_wait);348348+ }347349}348350static void msg_free_recv(struct ipmi_recv_msg *msg)349351{350350- if (atomic_dec_and_test(&msg_tofree))351351- complete(&msg_wait);352352+ if (atomic_dec_and_test(&msg_tofree)) {353353+ if (!oops_in_progress)354354+ complete(&msg_wait);355355+ }352356}353357static struct ipmi_smi_msg smi_msg = {354358 .done = msg_free_smi···438434 rv = __ipmi_set_timeout(&smi_msg,439435 &recv_msg,440436 &send_heartbeat_now);441441- if (rv)437437+ if (rv) {438438+ atomic_set(&msg_tofree, 0);442439 return rv;440440+ }443441444442 wait_for_completion(&msg_wait);445443···586580 &recv_msg,587581 1);588582 if (rv) {583583+ atomic_set(&msg_tofree, 0);589584 pr_warn("heartbeat send failure: %d\n", rv);590585 return rv;591586 }