lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 236/917] ipmi: Disable some operations during a panic
    Date
    From: Corey Minyard <cminyard@mvista.com>

    [ Upstream commit b36eb5e7b75a756baa64909a176dd4269ee05a8b ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/char/ipmi/ipmi_msghandler.c | 10 +++++++---
    drivers/char/ipmi/ipmi_watchdog.c | 17 ++++++++++++-----
    2 files changed, 19 insertions(+), 8 deletions(-)

    diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
    index e96cb5c4f97a3..a08f53f208bfe 100644
    --- a/drivers/char/ipmi/ipmi_msghandler.c
    +++ b/drivers/char/ipmi/ipmi_msghandler.c
    @@ -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);
    }
    diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
    index f855a9665c284..883b4a3410122 100644
    --- a/drivers/char/ipmi/ipmi_watchdog.c
    +++ b/drivers/char/ipmi/ipmi_watchdog.c
    @@ -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;
    }
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 02:00    [W:2.692 / U:0.888 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site