lkml.org 
[lkml]   [2020]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 023/118] x86/Hyper-V: Report crash data in die() when panic_on_oops is set
    Date
    From: Tianyu Lan <Tianyu.Lan@microsoft.com>

    commit f3a99e761efa616028b255b4de58e9b5b87c5545 upstream.

    When oops happens with panic_on_oops unset, the oops
    thread is killed by die() and system continues to run.
    In such case, guest should not report crash register
    data to host since system still runs. Check panic_on_oops
    and return directly in hyperv_report_panic() when the function
    is called in the die() and panic_on_oops is unset. Fix it.

    Fixes: 7ed4325a44ea ("Drivers: hv: vmbus: Make panic reporting to be more useful")
    Signed-off-by: Tianyu Lan <Tianyu.Lan@microsoft.com>
    Reviewed-by: Michael Kelley <mikelley@microsoft.com>
    Link: https://lore.kernel.org/r/20200406155331.2105-7-Tianyu.Lan@microsoft.com
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/hyperv/hv_init.c | 6 +++++-
    drivers/hv/vmbus_drv.c | 5 +++--
    include/asm-generic/mshyperv.h | 2 +-
    3 files changed, 9 insertions(+), 4 deletions(-)

    --- a/arch/x86/hyperv/hv_init.c
    +++ b/arch/x86/hyperv/hv_init.c
    @@ -19,6 +19,7 @@
    #include <linux/mm.h>
    #include <linux/hyperv.h>
    #include <linux/slab.h>
    +#include <linux/kernel.h>
    #include <linux/cpuhotplug.h>
    #include <clocksource/hyperv_timer.h>

    @@ -354,11 +355,14 @@ void hyperv_cleanup(void)
    }
    EXPORT_SYMBOL_GPL(hyperv_cleanup);

    -void hyperv_report_panic(struct pt_regs *regs, long err)
    +void hyperv_report_panic(struct pt_regs *regs, long err, bool in_die)
    {
    static bool panic_reported;
    u64 guest_id;

    + if (in_die && !panic_on_oops)
    + return;
    +
    /*
    * We prefer to report panic on 'die' chain as we have proper
    * registers to report, but if we miss it (e.g. on BUG()) we need
    --- a/drivers/hv/vmbus_drv.c
    +++ b/drivers/hv/vmbus_drv.c
    @@ -31,6 +31,7 @@
    #include <linux/kdebug.h>
    #include <linux/efi.h>
    #include <linux/random.h>
    +#include <linux/kernel.h>
    #include <linux/syscore_ops.h>
    #include <clocksource/hyperv_timer.h>
    #include "hyperv_vmbus.h"
    @@ -75,7 +76,7 @@ static int hyperv_panic_event(struct not
    if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE
    && hyperv_report_reg()) {
    regs = current_pt_regs();
    - hyperv_report_panic(regs, val);
    + hyperv_report_panic(regs, val, false);
    }
    return NOTIFY_DONE;
    }
    @@ -92,7 +93,7 @@ static int hyperv_die_event(struct notif
    * the notification here.
    */
    if (hyperv_report_reg())
    - hyperv_report_panic(regs, val);
    + hyperv_report_panic(regs, val, true);
    return NOTIFY_DONE;
    }

    --- a/include/asm-generic/mshyperv.h
    +++ b/include/asm-generic/mshyperv.h
    @@ -163,7 +163,7 @@ static inline int cpumask_to_vpset(struc
    return nr_bank;
    }

    -void hyperv_report_panic(struct pt_regs *regs, long err);
    +void hyperv_report_panic(struct pt_regs *regs, long err, bool in_die);
    void hyperv_report_panic_msg(phys_addr_t pa, size_t size);
    bool hv_is_hyperv_initialized(void);
    void hyperv_cleanup(void);

    \
     
     \ /
      Last update: 2020-04-22 12:18    [W:4.234 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site