[PATCH 3.16.y-ckt 48/71] Drivers: hv: vmbus: Add support for VMBus panic notifier handler

Luis Henriques luis.henriques at canonical.com
Tue Jun 30 16:19:47 UTC 2015


On Thu, Jun 25, 2015 at 11:02:27AM +0100, Luis Henriques wrote:
> 3.16.7-ckt14 -stable review patch.  If anyone has any objections, please let me know.
>

As pointed out by Greg, this is actually a new feature that shouldn't
be added to -stable releases.  Thus, I'm dropping this patch and
5ef5b6927f14 ("Drivers: hv: vmbus: Correcting truncation error for
constant HV_CRASH_CTL_CRASH_NOTIFY")

Cheers,
--
Luís

> ------------------
> 
> From: Nick Meier <nmeier at microsoft.com>
> 
> commit 96c1d0581d00f7abe033350edb021a9d947d8d81 upstream.
> 
> Hyper-V allows a guest to notify the Hyper-V host that a panic
> condition occured.  This notification can include up to five 64
> bit values.  These 64 bit values are written into crash MSRs.
> Once the data has been written into the crash MSRs, the host is
> then notified by writing into a Crash Control MSR.  On the Hyper-V
> host, the panic notification data is captured in the Windows Event
> log as a 18590 event.
> 
> Crash MSRs are defined in appendix H of the Hypervisor Top Level
> Functional Specification.  At the time of this patch, v4.0 is the
> current functional spec.  The URL for the v4.0 document is:
> 
> http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BDEF-79EEF16E880B/Hypervisor Top Level Functional Specification v4.0.docx
> 
> Signed-off-by: Nick Meier <nmeier at microsoft.com>
> Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
> Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
> ---
>  drivers/hv/hyperv_vmbus.h | 11 +++++++++++
>  drivers/hv/vmbus_drv.c    | 35 +++++++++++++++++++++++++++++++++++
>  2 files changed, 46 insertions(+)
> 
> diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
> index c386d8dc7223..64318c03002a 100644
> --- a/drivers/hv/hyperv_vmbus.h
> +++ b/drivers/hv/hyperv_vmbus.h
> @@ -49,6 +49,17 @@ enum hv_cpuid_function {
>  	HVCPUID_IMPLEMENTATION_LIMITS		= 0x40000005,
>  };
>  
> +#define  HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE   0x400
> +
> +#define HV_X64_MSR_CRASH_P0   0x40000100
> +#define HV_X64_MSR_CRASH_P1   0x40000101
> +#define HV_X64_MSR_CRASH_P2   0x40000102
> +#define HV_X64_MSR_CRASH_P3   0x40000103
> +#define HV_X64_MSR_CRASH_P4   0x40000104
> +#define HV_X64_MSR_CRASH_CTL  0x40000105
> +
> +#define HV_CRASH_CTL_CRASH_NOTIFY 0x8000000000000000
> +
>  /* Define version of the synthetic interrupt controller. */
>  #define HV_SYNIC_VERSION		(1)
>  
> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index 4d6b26979fbd..3d2d710744ca 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -35,6 +35,8 @@
>  #include <asm/hyperv.h>
>  #include <asm/hypervisor.h>
>  #include <asm/mshyperv.h>
> +#include <linux/notifier.h>
> +#include <linux/ptrace.h>
>  #include "hyperv_vmbus.h"
>  
>  static struct acpi_device  *hv_acpi_dev;
> @@ -43,6 +45,31 @@ static struct tasklet_struct msg_dpc;
>  static struct completion probe_event;
>  static int irq;
>  
> +
> +int hyperv_panic_event(struct notifier_block *nb,
> +			unsigned long event, void *ptr)
> +{
> +	struct pt_regs *regs;
> +
> +	regs = current_pt_regs();
> +
> +	wrmsrl(HV_X64_MSR_CRASH_P0, regs->ip);
> +	wrmsrl(HV_X64_MSR_CRASH_P1, regs->ax);
> +	wrmsrl(HV_X64_MSR_CRASH_P2, regs->bx);
> +	wrmsrl(HV_X64_MSR_CRASH_P3, regs->cx);
> +	wrmsrl(HV_X64_MSR_CRASH_P4, regs->dx);
> +
> +	/*
> +	 * Let Hyper-V know there is crash data available
> +	 */
> +	wrmsrl(HV_X64_MSR_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY);
> +	return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block hyperv_panic_block = {
> +	.notifier_call = hyperv_panic_event,
> +};
> +
>  struct resource hyperv_mmio = {
>  	.name  = "hyperv mmio",
>  	.flags = IORESOURCE_MEM,
> @@ -711,6 +738,14 @@ static int vmbus_bus_init(int irq)
>  	if (ret)
>  		goto err_alloc;
>  
> +	/*
> +	 * Only register if the crash MSRs are available
> +	 */
> +	if (ms_hyperv.features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) {
> +		atomic_notifier_chain_register(&panic_notifier_list,
> +					       &hyperv_panic_block);
> +	}
> +
>  	vmbus_request_offers();
>  
>  	return 0;




More information about the kernel-team mailing list