mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 22:51:35 +00:00
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 <cminyard@mvista.com>
This commit is contained in:
parent
db05ddf7f3
commit
b36eb5e7b7
@ -4789,7 +4789,9 @@ static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0);
|
||||
static void free_smi_msg(struct ipmi_smi_msg *msg)
|
||||
{
|
||||
atomic_dec(&smi_msg_inuse_count);
|
||||
kfree(msg);
|
||||
/* Try to keep as much stuff out of the panic path as possible. */
|
||||
if (!oops_in_progress)
|
||||
kfree(msg);
|
||||
}
|
||||
|
||||
struct ipmi_smi_msg *ipmi_alloc_smi_msg(void)
|
||||
@ -4808,7 +4810,9 @@ EXPORT_SYMBOL(ipmi_alloc_smi_msg);
|
||||
static void free_recv_msg(struct ipmi_recv_msg *msg)
|
||||
{
|
||||
atomic_dec(&recv_msg_inuse_count);
|
||||
kfree(msg);
|
||||
/* Try to keep as much stuff out of the panic path as possible. */
|
||||
if (!oops_in_progress)
|
||||
kfree(msg);
|
||||
}
|
||||
|
||||
static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
|
||||
@ -4826,7 +4830,7 @@ static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
|
||||
|
||||
void ipmi_free_recv_msg(struct ipmi_recv_msg *msg)
|
||||
{
|
||||
if (msg->user)
|
||||
if (msg->user && !oops_in_progress)
|
||||
kref_put(&msg->user->refcount, free_user);
|
||||
msg->done(msg);
|
||||
}
|
||||
|
@ -342,13 +342,17 @@ static atomic_t msg_tofree = ATOMIC_INIT(0);
|
||||
static DECLARE_COMPLETION(msg_wait);
|
||||
static void msg_free_smi(struct ipmi_smi_msg *msg)
|
||||
{
|
||||
if (atomic_dec_and_test(&msg_tofree))
|
||||
complete(&msg_wait);
|
||||
if (atomic_dec_and_test(&msg_tofree)) {
|
||||
if (!oops_in_progress)
|
||||
complete(&msg_wait);
|
||||
}
|
||||
}
|
||||
static void msg_free_recv(struct ipmi_recv_msg *msg)
|
||||
{
|
||||
if (atomic_dec_and_test(&msg_tofree))
|
||||
complete(&msg_wait);
|
||||
if (atomic_dec_and_test(&msg_tofree)) {
|
||||
if (!oops_in_progress)
|
||||
complete(&msg_wait);
|
||||
}
|
||||
}
|
||||
static struct ipmi_smi_msg smi_msg = {
|
||||
.done = msg_free_smi
|
||||
@ -434,8 +438,10 @@ static int _ipmi_set_timeout(int do_heartbeat)
|
||||
rv = __ipmi_set_timeout(&smi_msg,
|
||||
&recv_msg,
|
||||
&send_heartbeat_now);
|
||||
if (rv)
|
||||
if (rv) {
|
||||
atomic_set(&msg_tofree, 0);
|
||||
return rv;
|
||||
}
|
||||
|
||||
wait_for_completion(&msg_wait);
|
||||
|
||||
@ -580,6 +586,7 @@ restart:
|
||||
&recv_msg,
|
||||
1);
|
||||
if (rv) {
|
||||
atomic_set(&msg_tofree, 0);
|
||||
pr_warn("heartbeat send failure: %d\n", rv);
|
||||
return rv;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user