linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] x86/xen: support booting PVH guest via standard boot path
@ 2017-11-09 13:27 Juergen Gross
  2017-11-09 13:27 ` [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper Juergen Gross
  0 siblings, 1 reply; 5+ messages in thread
From: Juergen Gross @ 2017-11-09 13:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, rkrcmar, pv-drivers, akataria, virtualization, pavel, hpa,
	tglx, sthemmin, x86, moltmann, mingo, linux-graphics-maintainer,
	linux-input, xen-devel, len.brown, arnd, linux-pm, xdeguillard,
	haiyangz, rusty, pbonzini, boris.ostrovsky, Juergen Gross, gregkh,
	dmitry.torokhov, rjw, devel

Booting a Xen PVH guest requires a special boot entry as it is
mandatory to setup some Xen-specific interfaces rather early. When grub
or OVMF are used as boot loaders, however, those will fill the boot
parameters in zeropage and there is no longer a need to do something
PVH specific in the early boot path.

This patch series adds support for that scenario by identifying PVH
environment and doing the required init steps via Xen hooks instead of
using a dedicated boot entry.

The dedicated entry is still mandatory for support of Dom0 running in
PVH mode as in this case there is no grub or OVMF involved for filling
in the boot parameters.

Changes in V2:
- added new patches 1 and 2

Cc: kys@microsoft.com
Cc: haiyangz@microsoft.com
Cc: sthemmin@microsoft.com
Cc: akataria@vmware.com
Cc: pbonzini@redhat.com
Cc: rkrcmar@redhat.com
Cc: boris.ostrovsky@oracle.com
Cc: rusty@rustcorp.com.au
Cc: devel@linuxdriverproject.org
Cc: virtualization@lists.linux-foundation.org
Cc: kvm@vger.kernel.org
Cc: xen-devel@lists.xenproject.org
Cc: linux-graphics-maintainer@vmware.com
Cc: pv-drivers@vmware.com
Cc: dmitry.torokhov@gmail.com
Cc: xdeguillard@vmware.com
Cc: moltmann@vmware.com
Cc: arnd@arndb.de
Cc: gregkh@linuxfoundation.org
Cc: linux-input@vger.kernel.org
Cc: rjw@rjwysocki.net
Cc: len.brown@intel.com
Cc: pavel@ucw.cz
Cc: linux-pm@vger.kernel.org

Juergen Gross (5):
  x86: merge x86_hyper into x86_platform and x86_init
  x86: add enum for hypervisors to replace x86_hyper
  x86/acpi: add test for ACPI_FADT_NO_VGA
  x86: add guest_late_init hook to hypervisor_x86 structure
  x86/xen: use guest_late_init to detect Xen PVH guest

 arch/x86/hyperv/hv_init.c         |  2 +-
 arch/x86/include/asm/hypervisor.h | 46 +++++++++++-----------------
 arch/x86/include/asm/kvm_para.h   |  2 --
 arch/x86/include/asm/x86_init.h   | 27 +++++++++++++++++
 arch/x86/kernel/acpi/boot.c       |  5 +++
 arch/x86/kernel/apic/apic.c       |  2 +-
 arch/x86/kernel/cpu/hypervisor.c  | 64 +++++++++++++++++++++------------------
 arch/x86/kernel/cpu/mshyperv.c    |  6 ++--
 arch/x86/kernel/cpu/vmware.c      |  8 ++---
 arch/x86/kernel/kvm.c             |  9 +++---
 arch/x86/kernel/setup.c           |  2 +-
 arch/x86/kernel/x86_init.c        | 10 ++++++
 arch/x86/mm/init.c                |  2 +-
 arch/x86/xen/enlighten_hvm.c      | 36 +++++++++++++++++-----
 arch/x86/xen/enlighten_pv.c       |  6 ++--
 arch/x86/xen/enlighten_pvh.c      |  9 ------
 drivers/hv/vmbus_drv.c            |  2 +-
 drivers/input/mouse/vmmouse.c     | 10 +++---
 drivers/misc/vmw_balloon.c        |  2 +-
 include/linux/hypervisor.h        |  8 +++--
 20 files changed, 153 insertions(+), 105 deletions(-)

-- 
2.12.3

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
  2017-11-09 13:27 [PATCH v2 0/5] x86/xen: support booting PVH guest via standard boot path Juergen Gross
@ 2017-11-09 13:27 ` Juergen Gross
  2017-11-09 17:57   ` Xavier Deguillard
  2017-11-10 18:26   ` Dmitry Torokhov
  0 siblings, 2 replies; 5+ messages in thread
From: Juergen Gross @ 2017-11-09 13:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, rkrcmar, pv-drivers, akataria, virtualization, hpa, tglx,
	sthemmin, x86, moltmann, mingo, linux-graphics-maintainer,
	linux-input, xen-devel, arnd, xdeguillard, haiyangz, pbonzini,
	boris.ostrovsky, Juergen Gross, gregkh, dmitry.torokhov, devel

The x86_hyper pointer is only used for checking whether a virtual
device is supporting the hypervisor the system is running on.

Use an enum for that purpose instead and drop the x86_hyper pointer.

Cc: kys@microsoft.com
Cc: haiyangz@microsoft.com
Cc: sthemmin@microsoft.com
Cc: akataria@vmware.com
Cc: pbonzini@redhat.com
Cc: rkrcmar@redhat.com
Cc: boris.ostrovsky@oracle.com
Cc: devel@linuxdriverproject.org
Cc: virtualization@lists.linux-foundation.org
Cc: kvm@vger.kernel.org
Cc: xen-devel@lists.xenproject.org
Cc: linux-graphics-maintainer@vmware.com
Cc: pv-drivers@vmware.com
Cc: dmitry.torokhov@gmail.com
Cc: xdeguillard@vmware.com
Cc: moltmann@vmware.com
Cc: arnd@arndb.de
Cc: gregkh@linuxfoundation.org
Cc: linux-input@vger.kernel.org

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 arch/x86/hyperv/hv_init.c         |  2 +-
 arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++---------
 arch/x86/kernel/cpu/hypervisor.c  | 12 +++++++++---
 arch/x86/kernel/cpu/mshyperv.c    |  4 ++--
 arch/x86/kernel/cpu/vmware.c      |  4 ++--
 arch/x86/kernel/kvm.c             |  4 ++--
 arch/x86/xen/enlighten_hvm.c      |  4 ++--
 arch/x86/xen/enlighten_pv.c       |  4 ++--
 drivers/hv/vmbus_drv.c            |  2 +-
 drivers/input/mouse/vmmouse.c     | 10 ++++------
 drivers/misc/vmw_balloon.c        |  2 +-
 11 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index a5db63f728a2..a0b86cf486e0 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -113,7 +113,7 @@ void hyperv_init(void)
 	u64 guest_id;
 	union hv_x64_msr_hypercall_contents hypercall_msr;
 
-	if (x86_hyper != &x86_hyper_ms_hyperv)
+	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
 		return;
 
 	/* Allocate percpu VP index */
diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
index 0eca7239a7aa..1b0a5abcd8ae 100644
--- a/arch/x86/include/asm/hypervisor.h
+++ b/arch/x86/include/asm/hypervisor.h
@@ -29,6 +29,16 @@
 /*
  * x86 hypervisor information
  */
+
+enum x86_hypervisor_type {
+	X86_HYPER_NATIVE = 0,
+	X86_HYPER_VMWARE,
+	X86_HYPER_MS_HYPERV,
+	X86_HYPER_XEN_PV,
+	X86_HYPER_XEN_HVM,
+	X86_HYPER_KVM,
+};
+
 struct hypervisor_x86 {
 	/* Hypervisor name */
 	const char	*name;
@@ -36,6 +46,9 @@ struct hypervisor_x86 {
 	/* Detection routine */
 	uint32_t	(*detect)(void);
 
+	/* Hypervisor type */
+	enum x86_hypervisor_type type;
+
 	/* init time callbacks */
 	struct x86_hyper_init init;
 
@@ -43,15 +56,7 @@ struct hypervisor_x86 {
 	struct x86_hyper_runtime runtime;
 };
 
-extern const struct hypervisor_x86 *x86_hyper;
-
-/* Recognized hypervisors */
-extern const struct hypervisor_x86 x86_hyper_vmware;
-extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
-extern const struct hypervisor_x86 x86_hyper_xen_pv;
-extern const struct hypervisor_x86 x86_hyper_xen_hvm;
-extern const struct hypervisor_x86 x86_hyper_kvm;
-
+extern enum x86_hypervisor_type x86_hyper_type;
 extern void init_hypervisor_platform(void);
 #else
 static inline void init_hypervisor_platform(void) { }
diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
index 22226c1bf092..bea8d3e24f50 100644
--- a/arch/x86/kernel/cpu/hypervisor.c
+++ b/arch/x86/kernel/cpu/hypervisor.c
@@ -26,6 +26,12 @@
 #include <asm/processor.h>
 #include <asm/hypervisor.h>
 
+extern const struct hypervisor_x86 x86_hyper_vmware;
+extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
+extern const struct hypervisor_x86 x86_hyper_xen_pv;
+extern const struct hypervisor_x86 x86_hyper_xen_hvm;
+extern const struct hypervisor_x86 x86_hyper_kvm;
+
 static const __initconst struct hypervisor_x86 * const hypervisors[] =
 {
 #ifdef CONFIG_XEN_PV
@@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
 #endif
 };
 
-const struct hypervisor_x86 *x86_hyper;
-EXPORT_SYMBOL(x86_hyper);
+enum x86_hypervisor_type x86_hyper_type;
+EXPORT_SYMBOL(x86_hyper_type);
 
 static inline const struct hypervisor_x86 * __init
 detect_hypervisor_vendor(void)
@@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void)
 	copy_array(&h->init, &x86_init.hyper, sizeof(h->init));
 	copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime));
 
-	x86_hyper = h;
+	x86_hyper_type = h->type;
 	x86_init.hyper.init_platform();
 }
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 6bb84d655e4b..85eb5fc180c8 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void)
 #endif
 }
 
-const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
+const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
 	.name			= "Microsoft Hyper-V",
 	.detect			= ms_hyperv_platform,
+	.type			= X86_HYPER_MS_HYPERV,
 	.init.init_platform	= ms_hyperv_init_platform,
 };
-EXPORT_SYMBOL(x86_hyper_ms_hyperv);
diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
index 4804c1d063c8..8e005329648b 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void)
 	       (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0;
 }
 
-const __refconst struct hypervisor_x86 x86_hyper_vmware = {
+const __initconst struct hypervisor_x86 x86_hyper_vmware = {
 	.name			= "VMware",
 	.detect			= vmware_platform,
+	.type			= X86_HYPER_VMWARE,
 	.init.init_platform	= vmware_platform_setup,
 	.init.x2apic_available	= vmware_legacy_x2apic_available,
 };
-EXPORT_SYMBOL(x86_hyper_vmware);
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 9dca8437c795..a94de09edbed 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void)
 	return kvm_cpuid_base();
 }
 
-const struct hypervisor_x86 x86_hyper_kvm __refconst = {
+const __initconst struct hypervisor_x86 x86_hyper_kvm = {
 	.name			= "KVM",
 	.detect			= kvm_detect,
+	.type			= X86_HYPER_KVM,
 	.init.x2apic_available	= kvm_para_available,
 };
-EXPORT_SYMBOL_GPL(x86_hyper_kvm);
 
 static __init int activate_jump_labels(void)
 {
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
index 7b1622089f96..754d5391d9fa 100644
--- a/arch/x86/xen/enlighten_hvm.c
+++ b/arch/x86/xen/enlighten_hvm.c
@@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void)
 	return xen_cpuid_base();
 }
 
-const struct hypervisor_x86 x86_hyper_xen_hvm = {
+const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = {
 	.name                   = "Xen HVM",
 	.detect                 = xen_platform_hvm,
+	.type			= X86_HYPER_XEN_HVM,
 	.init.init_platform     = xen_hvm_guest_init,
 	.init.x2apic_available  = xen_x2apic_para_available,
 	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
 	.runtime.pin_vcpu       = xen_pin_vcpu,
 };
-EXPORT_SYMBOL(x86_hyper_xen_hvm);
diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index 69d1a7054ddb..168efb2534c0 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void)
 	return 0;
 }
 
-const struct hypervisor_x86 x86_hyper_xen_pv = {
+const __initconst struct hypervisor_x86 x86_hyper_xen_pv = {
 	.name                   = "Xen PV",
 	.detect                 = xen_platform_pv,
+	.type			= X86_HYPER_XEN_PV,
 	.runtime.pin_vcpu       = xen_pin_vcpu,
 };
-EXPORT_SYMBOL(x86_hyper_xen_pv);
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 937801ac2fe0..2cd134dd94d2 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void)
 {
 	int ret, t;
 
-	if (x86_hyper != &x86_hyper_ms_hyperv)
+	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
 		return -ENODEV;
 
 	init_completion(&probe_event);
diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c
index 0f586780ceb4..1ae5c1ef3f5b 100644
--- a/drivers/input/mouse/vmmouse.c
+++ b/drivers/input/mouse/vmmouse.c
@@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse)
 /*
  * Array of supported hypervisors.
  */
-static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = {
-	&x86_hyper_vmware,
-#ifdef CONFIG_KVM_GUEST
-	&x86_hyper_kvm,
-#endif
+static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = {
+	X86_HYPER_VMWARE,
+	X86_HYPER_KVM,
 };
 
 /**
@@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void)
 	int i;
 
 	for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++)
-		if (vmmouse_supported_hypervisors[i] == x86_hyper)
+		if (vmmouse_supported_hypervisors[i] == x86_hyper_type)
 			return true;
 
 	return false;
diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
index 1e688bfec567..9047c0a529b2 100644
--- a/drivers/misc/vmw_balloon.c
+++ b/drivers/misc/vmw_balloon.c
@@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void)
 	 * Check if we are running on VMware's hypervisor and bail out
 	 * if we are not.
 	 */
-	if (x86_hyper != &x86_hyper_vmware)
+	if (x86_hyper_type != X86_HYPER_VMWARE)
 		return -ENODEV;
 
 	for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;
-- 
2.12.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
  2017-11-09 13:27 ` [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper Juergen Gross
@ 2017-11-09 17:57   ` Xavier Deguillard
  2017-11-10 18:26   ` Dmitry Torokhov
  1 sibling, 0 replies; 5+ messages in thread
From: Xavier Deguillard @ 2017-11-09 17:57 UTC (permalink / raw)
  To: Juergen Gross
  Cc: kvm, rkrcmar, pv-drivers, virtualization, hpa, tglx, sthemmin,
	x86, akataria, mingo, linux-graphics-maintainer, linux-input,
	xen-devel, arnd, haiyangz, pbonzini, boris.ostrovsky, gregkh,
	dmitry.torokhov, linux-kernel, devel

Hello Juergen,

The changes to vmw_balloon.c looks good.

Acked-by: Xavier Deguillard <xdeguillard@vmware.com>

Xavier

On Thu, Nov 09, 2017 at 02:27:36PM +0100, Juergen Gross wrote:
> The x86_hyper pointer is only used for checking whether a virtual
> device is supporting the hypervisor the system is running on.
> 
> Use an enum for that purpose instead and drop the x86_hyper pointer.
> 
> Cc: kys@microsoft.com
> Cc: haiyangz@microsoft.com
> Cc: sthemmin@microsoft.com
> Cc: akataria@vmware.com
> Cc: pbonzini@redhat.com
> Cc: rkrcmar@redhat.com
> Cc: boris.ostrovsky@oracle.com
> Cc: devel@linuxdriverproject.org
> Cc: virtualization@lists.linux-foundation.org
> Cc: kvm@vger.kernel.org
> Cc: xen-devel@lists.xenproject.org
> Cc: linux-graphics-maintainer@vmware.com
> Cc: pv-drivers@vmware.com
> Cc: dmitry.torokhov@gmail.com
> Cc: xdeguillard@vmware.com
> Cc: moltmann@vmware.com
> Cc: arnd@arndb.de
> Cc: gregkh@linuxfoundation.org
> Cc: linux-input@vger.kernel.org
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
>  arch/x86/hyperv/hv_init.c         |  2 +-
>  arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++---------
>  arch/x86/kernel/cpu/hypervisor.c  | 12 +++++++++---
>  arch/x86/kernel/cpu/mshyperv.c    |  4 ++--
>  arch/x86/kernel/cpu/vmware.c      |  4 ++--
>  arch/x86/kernel/kvm.c             |  4 ++--
>  arch/x86/xen/enlighten_hvm.c      |  4 ++--
>  arch/x86/xen/enlighten_pv.c       |  4 ++--
>  drivers/hv/vmbus_drv.c            |  2 +-
>  drivers/input/mouse/vmmouse.c     | 10 ++++------
>  drivers/misc/vmw_balloon.c        |  2 +-
>  11 files changed, 40 insertions(+), 31 deletions(-)
> 
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index a5db63f728a2..a0b86cf486e0 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -113,7 +113,7 @@ void hyperv_init(void)
>  	u64 guest_id;
>  	union hv_x64_msr_hypercall_contents hypercall_msr;
>  
> -	if (x86_hyper != &x86_hyper_ms_hyperv)
> +	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
>  		return;
>  
>  	/* Allocate percpu VP index */
> diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
> index 0eca7239a7aa..1b0a5abcd8ae 100644
> --- a/arch/x86/include/asm/hypervisor.h
> +++ b/arch/x86/include/asm/hypervisor.h
> @@ -29,6 +29,16 @@
>  /*
>   * x86 hypervisor information
>   */
> +
> +enum x86_hypervisor_type {
> +	X86_HYPER_NATIVE = 0,
> +	X86_HYPER_VMWARE,
> +	X86_HYPER_MS_HYPERV,
> +	X86_HYPER_XEN_PV,
> +	X86_HYPER_XEN_HVM,
> +	X86_HYPER_KVM,
> +};
> +
>  struct hypervisor_x86 {
>  	/* Hypervisor name */
>  	const char	*name;
> @@ -36,6 +46,9 @@ struct hypervisor_x86 {
>  	/* Detection routine */
>  	uint32_t	(*detect)(void);
>  
> +	/* Hypervisor type */
> +	enum x86_hypervisor_type type;
> +
>  	/* init time callbacks */
>  	struct x86_hyper_init init;
>  
> @@ -43,15 +56,7 @@ struct hypervisor_x86 {
>  	struct x86_hyper_runtime runtime;
>  };
>  
> -extern const struct hypervisor_x86 *x86_hyper;
> -
> -/* Recognized hypervisors */
> -extern const struct hypervisor_x86 x86_hyper_vmware;
> -extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
> -extern const struct hypervisor_x86 x86_hyper_xen_pv;
> -extern const struct hypervisor_x86 x86_hyper_xen_hvm;
> -extern const struct hypervisor_x86 x86_hyper_kvm;
> -
> +extern enum x86_hypervisor_type x86_hyper_type;
>  extern void init_hypervisor_platform(void);
>  #else
>  static inline void init_hypervisor_platform(void) { }
> diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
> index 22226c1bf092..bea8d3e24f50 100644
> --- a/arch/x86/kernel/cpu/hypervisor.c
> +++ b/arch/x86/kernel/cpu/hypervisor.c
> @@ -26,6 +26,12 @@
>  #include <asm/processor.h>
>  #include <asm/hypervisor.h>
>  
> +extern const struct hypervisor_x86 x86_hyper_vmware;
> +extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
> +extern const struct hypervisor_x86 x86_hyper_xen_pv;
> +extern const struct hypervisor_x86 x86_hyper_xen_hvm;
> +extern const struct hypervisor_x86 x86_hyper_kvm;
> +
>  static const __initconst struct hypervisor_x86 * const hypervisors[] =
>  {
>  #ifdef CONFIG_XEN_PV
> @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
>  #endif
>  };
>  
> -const struct hypervisor_x86 *x86_hyper;
> -EXPORT_SYMBOL(x86_hyper);
> +enum x86_hypervisor_type x86_hyper_type;
> +EXPORT_SYMBOL(x86_hyper_type);
>  
>  static inline const struct hypervisor_x86 * __init
>  detect_hypervisor_vendor(void)
> @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void)
>  	copy_array(&h->init, &x86_init.hyper, sizeof(h->init));
>  	copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime));
>  
> -	x86_hyper = h;
> +	x86_hyper_type = h->type;
>  	x86_init.hyper.init_platform();
>  }
> diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
> index 6bb84d655e4b..85eb5fc180c8 100644
> --- a/arch/x86/kernel/cpu/mshyperv.c
> +++ b/arch/x86/kernel/cpu/mshyperv.c
> @@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void)
>  #endif
>  }
>  
> -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
> +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
>  	.name			= "Microsoft Hyper-V",
>  	.detect			= ms_hyperv_platform,
> +	.type			= X86_HYPER_MS_HYPERV,
>  	.init.init_platform	= ms_hyperv_init_platform,
>  };
> -EXPORT_SYMBOL(x86_hyper_ms_hyperv);
> diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
> index 4804c1d063c8..8e005329648b 100644
> --- a/arch/x86/kernel/cpu/vmware.c
> +++ b/arch/x86/kernel/cpu/vmware.c
> @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void)
>  	       (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0;
>  }
>  
> -const __refconst struct hypervisor_x86 x86_hyper_vmware = {
> +const __initconst struct hypervisor_x86 x86_hyper_vmware = {
>  	.name			= "VMware",
>  	.detect			= vmware_platform,
> +	.type			= X86_HYPER_VMWARE,
>  	.init.init_platform	= vmware_platform_setup,
>  	.init.x2apic_available	= vmware_legacy_x2apic_available,
>  };
> -EXPORT_SYMBOL(x86_hyper_vmware);
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 9dca8437c795..a94de09edbed 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void)
>  	return kvm_cpuid_base();
>  }
>  
> -const struct hypervisor_x86 x86_hyper_kvm __refconst = {
> +const __initconst struct hypervisor_x86 x86_hyper_kvm = {
>  	.name			= "KVM",
>  	.detect			= kvm_detect,
> +	.type			= X86_HYPER_KVM,
>  	.init.x2apic_available	= kvm_para_available,
>  };
> -EXPORT_SYMBOL_GPL(x86_hyper_kvm);
>  
>  static __init int activate_jump_labels(void)
>  {
> diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
> index 7b1622089f96..754d5391d9fa 100644
> --- a/arch/x86/xen/enlighten_hvm.c
> +++ b/arch/x86/xen/enlighten_hvm.c
> @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void)
>  	return xen_cpuid_base();
>  }
>  
> -const struct hypervisor_x86 x86_hyper_xen_hvm = {
> +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = {
>  	.name                   = "Xen HVM",
>  	.detect                 = xen_platform_hvm,
> +	.type			= X86_HYPER_XEN_HVM,
>  	.init.init_platform     = xen_hvm_guest_init,
>  	.init.x2apic_available  = xen_x2apic_para_available,
>  	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
>  	.runtime.pin_vcpu       = xen_pin_vcpu,
>  };
> -EXPORT_SYMBOL(x86_hyper_xen_hvm);
> diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
> index 69d1a7054ddb..168efb2534c0 100644
> --- a/arch/x86/xen/enlighten_pv.c
> +++ b/arch/x86/xen/enlighten_pv.c
> @@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void)
>  	return 0;
>  }
>  
> -const struct hypervisor_x86 x86_hyper_xen_pv = {
> +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = {
>  	.name                   = "Xen PV",
>  	.detect                 = xen_platform_pv,
> +	.type			= X86_HYPER_XEN_PV,
>  	.runtime.pin_vcpu       = xen_pin_vcpu,
>  };
> -EXPORT_SYMBOL(x86_hyper_xen_pv);
> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index 937801ac2fe0..2cd134dd94d2 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void)
>  {
>  	int ret, t;
>  
> -	if (x86_hyper != &x86_hyper_ms_hyperv)
> +	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
>  		return -ENODEV;
>  
>  	init_completion(&probe_event);
> diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c
> index 0f586780ceb4..1ae5c1ef3f5b 100644
> --- a/drivers/input/mouse/vmmouse.c
> +++ b/drivers/input/mouse/vmmouse.c
> @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse)
>  /*
>   * Array of supported hypervisors.
>   */
> -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = {
> -	&x86_hyper_vmware,
> -#ifdef CONFIG_KVM_GUEST
> -	&x86_hyper_kvm,
> -#endif
> +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = {
> +	X86_HYPER_VMWARE,
> +	X86_HYPER_KVM,
>  };
>  
>  /**
> @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void)
>  	int i;
>  
>  	for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++)
> -		if (vmmouse_supported_hypervisors[i] == x86_hyper)
> +		if (vmmouse_supported_hypervisors[i] == x86_hyper_type)
>  			return true;
>  
>  	return false;
> diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
> index 1e688bfec567..9047c0a529b2 100644
> --- a/drivers/misc/vmw_balloon.c
> +++ b/drivers/misc/vmw_balloon.c
> @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void)
>  	 * Check if we are running on VMware's hypervisor and bail out
>  	 * if we are not.
>  	 */
> -	if (x86_hyper != &x86_hyper_vmware)
> +	if (x86_hyper_type != X86_HYPER_VMWARE)
>  		return -ENODEV;
>  
>  	for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;
> -- 
> 2.12.3
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
  2017-11-09 13:27 ` [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper Juergen Gross
  2017-11-09 17:57   ` Xavier Deguillard
@ 2017-11-10 18:26   ` Dmitry Torokhov
  2017-11-10 20:39     ` KY Srinivasan
  1 sibling, 1 reply; 5+ messages in thread
From: Dmitry Torokhov @ 2017-11-10 18:26 UTC (permalink / raw)
  To: Juergen Gross
  Cc: kvm, rkrcmar, pv-drivers, akataria, virtualization, hpa, tglx,
	sthemmin, x86, moltmann, mingo, linux-graphics-maintainer,
	linux-input, xen-devel, arnd, xdeguillard, haiyangz, pbonzini,
	boris.ostrovsky, gregkh, linux-kernel, devel

On Thu, Nov 09, 2017 at 02:27:36PM +0100, Juergen Gross wrote:
> The x86_hyper pointer is only used for checking whether a virtual
> device is supporting the hypervisor the system is running on.
> 
> Use an enum for that purpose instead and drop the x86_hyper pointer.
> 
> Cc: kys@microsoft.com
> Cc: haiyangz@microsoft.com
> Cc: sthemmin@microsoft.com
> Cc: akataria@vmware.com
> Cc: pbonzini@redhat.com
> Cc: rkrcmar@redhat.com
> Cc: boris.ostrovsky@oracle.com
> Cc: devel@linuxdriverproject.org
> Cc: virtualization@lists.linux-foundation.org
> Cc: kvm@vger.kernel.org
> Cc: xen-devel@lists.xenproject.org
> Cc: linux-graphics-maintainer@vmware.com
> Cc: pv-drivers@vmware.com
> Cc: dmitry.torokhov@gmail.com
> Cc: xdeguillard@vmware.com
> Cc: moltmann@vmware.com
> Cc: arnd@arndb.de
> Cc: gregkh@linuxfoundation.org
> Cc: linux-input@vger.kernel.org
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
>  arch/x86/hyperv/hv_init.c         |  2 +-
>  arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++---------
>  arch/x86/kernel/cpu/hypervisor.c  | 12 +++++++++---
>  arch/x86/kernel/cpu/mshyperv.c    |  4 ++--
>  arch/x86/kernel/cpu/vmware.c      |  4 ++--
>  arch/x86/kernel/kvm.c             |  4 ++--
>  arch/x86/xen/enlighten_hvm.c      |  4 ++--
>  arch/x86/xen/enlighten_pv.c       |  4 ++--
>  drivers/hv/vmbus_drv.c            |  2 +-
>  drivers/input/mouse/vmmouse.c     | 10 ++++------

Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

>  drivers/misc/vmw_balloon.c        |  2 +-
>  11 files changed, 40 insertions(+), 31 deletions(-)
> 
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index a5db63f728a2..a0b86cf486e0 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -113,7 +113,7 @@ void hyperv_init(void)
>  	u64 guest_id;
>  	union hv_x64_msr_hypercall_contents hypercall_msr;
>  
> -	if (x86_hyper != &x86_hyper_ms_hyperv)
> +	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
>  		return;
>  
>  	/* Allocate percpu VP index */
> diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
> index 0eca7239a7aa..1b0a5abcd8ae 100644
> --- a/arch/x86/include/asm/hypervisor.h
> +++ b/arch/x86/include/asm/hypervisor.h
> @@ -29,6 +29,16 @@
>  /*
>   * x86 hypervisor information
>   */
> +
> +enum x86_hypervisor_type {
> +	X86_HYPER_NATIVE = 0,
> +	X86_HYPER_VMWARE,
> +	X86_HYPER_MS_HYPERV,
> +	X86_HYPER_XEN_PV,
> +	X86_HYPER_XEN_HVM,
> +	X86_HYPER_KVM,
> +};
> +
>  struct hypervisor_x86 {
>  	/* Hypervisor name */
>  	const char	*name;
> @@ -36,6 +46,9 @@ struct hypervisor_x86 {
>  	/* Detection routine */
>  	uint32_t	(*detect)(void);
>  
> +	/* Hypervisor type */
> +	enum x86_hypervisor_type type;
> +
>  	/* init time callbacks */
>  	struct x86_hyper_init init;
>  
> @@ -43,15 +56,7 @@ struct hypervisor_x86 {
>  	struct x86_hyper_runtime runtime;
>  };
>  
> -extern const struct hypervisor_x86 *x86_hyper;
> -
> -/* Recognized hypervisors */
> -extern const struct hypervisor_x86 x86_hyper_vmware;
> -extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
> -extern const struct hypervisor_x86 x86_hyper_xen_pv;
> -extern const struct hypervisor_x86 x86_hyper_xen_hvm;
> -extern const struct hypervisor_x86 x86_hyper_kvm;
> -
> +extern enum x86_hypervisor_type x86_hyper_type;
>  extern void init_hypervisor_platform(void);
>  #else
>  static inline void init_hypervisor_platform(void) { }
> diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
> index 22226c1bf092..bea8d3e24f50 100644
> --- a/arch/x86/kernel/cpu/hypervisor.c
> +++ b/arch/x86/kernel/cpu/hypervisor.c
> @@ -26,6 +26,12 @@
>  #include <asm/processor.h>
>  #include <asm/hypervisor.h>
>  
> +extern const struct hypervisor_x86 x86_hyper_vmware;
> +extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
> +extern const struct hypervisor_x86 x86_hyper_xen_pv;
> +extern const struct hypervisor_x86 x86_hyper_xen_hvm;
> +extern const struct hypervisor_x86 x86_hyper_kvm;
> +
>  static const __initconst struct hypervisor_x86 * const hypervisors[] =
>  {
>  #ifdef CONFIG_XEN_PV
> @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
>  #endif
>  };
>  
> -const struct hypervisor_x86 *x86_hyper;
> -EXPORT_SYMBOL(x86_hyper);
> +enum x86_hypervisor_type x86_hyper_type;
> +EXPORT_SYMBOL(x86_hyper_type);
>  
>  static inline const struct hypervisor_x86 * __init
>  detect_hypervisor_vendor(void)
> @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void)
>  	copy_array(&h->init, &x86_init.hyper, sizeof(h->init));
>  	copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime));
>  
> -	x86_hyper = h;
> +	x86_hyper_type = h->type;
>  	x86_init.hyper.init_platform();
>  }
> diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
> index 6bb84d655e4b..85eb5fc180c8 100644
> --- a/arch/x86/kernel/cpu/mshyperv.c
> +++ b/arch/x86/kernel/cpu/mshyperv.c
> @@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void)
>  #endif
>  }
>  
> -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
> +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
>  	.name			= "Microsoft Hyper-V",
>  	.detect			= ms_hyperv_platform,
> +	.type			= X86_HYPER_MS_HYPERV,
>  	.init.init_platform	= ms_hyperv_init_platform,
>  };
> -EXPORT_SYMBOL(x86_hyper_ms_hyperv);
> diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
> index 4804c1d063c8..8e005329648b 100644
> --- a/arch/x86/kernel/cpu/vmware.c
> +++ b/arch/x86/kernel/cpu/vmware.c
> @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void)
>  	       (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0;
>  }
>  
> -const __refconst struct hypervisor_x86 x86_hyper_vmware = {
> +const __initconst struct hypervisor_x86 x86_hyper_vmware = {
>  	.name			= "VMware",
>  	.detect			= vmware_platform,
> +	.type			= X86_HYPER_VMWARE,
>  	.init.init_platform	= vmware_platform_setup,
>  	.init.x2apic_available	= vmware_legacy_x2apic_available,
>  };
> -EXPORT_SYMBOL(x86_hyper_vmware);
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 9dca8437c795..a94de09edbed 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void)
>  	return kvm_cpuid_base();
>  }
>  
> -const struct hypervisor_x86 x86_hyper_kvm __refconst = {
> +const __initconst struct hypervisor_x86 x86_hyper_kvm = {
>  	.name			= "KVM",
>  	.detect			= kvm_detect,
> +	.type			= X86_HYPER_KVM,
>  	.init.x2apic_available	= kvm_para_available,
>  };
> -EXPORT_SYMBOL_GPL(x86_hyper_kvm);
>  
>  static __init int activate_jump_labels(void)
>  {
> diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
> index 7b1622089f96..754d5391d9fa 100644
> --- a/arch/x86/xen/enlighten_hvm.c
> +++ b/arch/x86/xen/enlighten_hvm.c
> @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void)
>  	return xen_cpuid_base();
>  }
>  
> -const struct hypervisor_x86 x86_hyper_xen_hvm = {
> +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = {
>  	.name                   = "Xen HVM",
>  	.detect                 = xen_platform_hvm,
> +	.type			= X86_HYPER_XEN_HVM,
>  	.init.init_platform     = xen_hvm_guest_init,
>  	.init.x2apic_available  = xen_x2apic_para_available,
>  	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
>  	.runtime.pin_vcpu       = xen_pin_vcpu,
>  };
> -EXPORT_SYMBOL(x86_hyper_xen_hvm);
> diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
> index 69d1a7054ddb..168efb2534c0 100644
> --- a/arch/x86/xen/enlighten_pv.c
> +++ b/arch/x86/xen/enlighten_pv.c
> @@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void)
>  	return 0;
>  }
>  
> -const struct hypervisor_x86 x86_hyper_xen_pv = {
> +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = {
>  	.name                   = "Xen PV",
>  	.detect                 = xen_platform_pv,
> +	.type			= X86_HYPER_XEN_PV,
>  	.runtime.pin_vcpu       = xen_pin_vcpu,
>  };
> -EXPORT_SYMBOL(x86_hyper_xen_pv);
> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index 937801ac2fe0..2cd134dd94d2 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void)
>  {
>  	int ret, t;
>  
> -	if (x86_hyper != &x86_hyper_ms_hyperv)
> +	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
>  		return -ENODEV;
>  
>  	init_completion(&probe_event);
> diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c
> index 0f586780ceb4..1ae5c1ef3f5b 100644
> --- a/drivers/input/mouse/vmmouse.c
> +++ b/drivers/input/mouse/vmmouse.c
> @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse)
>  /*
>   * Array of supported hypervisors.
>   */
> -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = {
> -	&x86_hyper_vmware,
> -#ifdef CONFIG_KVM_GUEST
> -	&x86_hyper_kvm,
> -#endif
> +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = {
> +	X86_HYPER_VMWARE,
> +	X86_HYPER_KVM,
>  };
>  
>  /**
> @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void)
>  	int i;
>  
>  	for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++)
> -		if (vmmouse_supported_hypervisors[i] == x86_hyper)
> +		if (vmmouse_supported_hypervisors[i] == x86_hyper_type)
>  			return true;
>  
>  	return false;
> diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
> index 1e688bfec567..9047c0a529b2 100644
> --- a/drivers/misc/vmw_balloon.c
> +++ b/drivers/misc/vmw_balloon.c
> @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void)
>  	 * Check if we are running on VMware's hypervisor and bail out
>  	 * if we are not.
>  	 */
> -	if (x86_hyper != &x86_hyper_vmware)
> +	if (x86_hyper_type != X86_HYPER_VMWARE)
>  		return -ENODEV;
>  
>  	for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;
> -- 
> 2.12.3
> 

-- 
Dmitry

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
  2017-11-10 18:26   ` Dmitry Torokhov
@ 2017-11-10 20:39     ` KY Srinivasan
  0 siblings, 0 replies; 5+ messages in thread
From: KY Srinivasan @ 2017-11-10 20:39 UTC (permalink / raw)
  To: Dmitry Torokhov, Juergen Gross
  Cc: kvm@vger.kernel.org, rkrcmar@redhat.com, pv-drivers@vmware.com,
	akataria@vmware.com, virtualization@lists.linux-foundation.org,
	hpa@zytor.com, tglx@linutronix.de, Stephen Hemminger,
	x86@kernel.org, moltmann@vmware.com, mingo@redhat.com,
	linux-graphics-maintainer@vmware.com, linux-input@vger.kernel.org,
	xen-devel@lists.xenproject.org, arnd@arndb.de,
	xdeguillard@vmware.com, Haiyang Zhang, pbonzini@redhat.com



> -----Original Message-----
> From: Dmitry Torokhov [mailto:dmitry.torokhov@gmail.com]
> Sent: Friday, November 10, 2017 10:26 AM
> To: Juergen Gross <jgross@suse.com>
> Cc: linux-kernel@vger.kernel.org; tglx@linutronix.de; mingo@redhat.com;
> hpa@zytor.com; x86@kernel.org; KY Srinivasan <kys@microsoft.com>;
> Haiyang Zhang <haiyangz@microsoft.com>; Stephen Hemminger
> <sthemmin@microsoft.com>; akataria@vmware.com;
> pbonzini@redhat.com; rkrcmar@redhat.com; boris.ostrovsky@oracle.com;
> devel@linuxdriverproject.org; virtualization@lists.linux-foundation.org;
> kvm@vger.kernel.org; xen-devel@lists.xenproject.org; linux-graphics-
> maintainer@vmware.com; pv-drivers@vmware.com;
> xdeguillard@vmware.com; moltmann@vmware.com; arnd@arndb.de;
> gregkh@linuxfoundation.org; linux-input@vger.kernel.org
> Subject: Re: [PATCH v2 2/5] x86: add enum for hypervisors to replace
> x86_hyper
> 
> On Thu, Nov 09, 2017 at 02:27:36PM +0100, Juergen Gross wrote:
> > The x86_hyper pointer is only used for checking whether a virtual
> > device is supporting the hypervisor the system is running on.
> >
> > Use an enum for that purpose instead and drop the x86_hyper pointer.
> >
> > Cc: kys@microsoft.com
> > Cc: haiyangz@microsoft.com
> > Cc: sthemmin@microsoft.com
> > Cc: akataria@vmware.com
> > Cc: pbonzini@redhat.com
> > Cc: rkrcmar@redhat.com
> > Cc: boris.ostrovsky@oracle.com
> > Cc: devel@linuxdriverproject.org
> > Cc: virtualization@lists.linux-foundation.org
> > Cc: kvm@vger.kernel.org
> > Cc: xen-devel@lists.xenproject.org
> > Cc: linux-graphics-maintainer@vmware.com
> > Cc: pv-drivers@vmware.com
> > Cc: dmitry.torokhov@gmail.com
> > Cc: xdeguillard@vmware.com
> > Cc: moltmann@vmware.com
> > Cc: arnd@arndb.de
> > Cc: gregkh@linuxfoundation.org
> > Cc: linux-input@vger.kernel.org
> >
> > Signed-off-by: Juergen Gross <jgross@suse.com>
> > ---
> >  arch/x86/hyperv/hv_init.c         |  2 +-
> >  arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++---------
> >  arch/x86/kernel/cpu/hypervisor.c  | 12 +++++++++---
> >  arch/x86/kernel/cpu/mshyperv.c    |  4 ++--
> >  arch/x86/kernel/cpu/vmware.c      |  4 ++--
> >  arch/x86/kernel/kvm.c             |  4 ++--
> >  arch/x86/xen/enlighten_hvm.c      |  4 ++--
> >  arch/x86/xen/enlighten_pv.c       |  4 ++--
> >  drivers/hv/vmbus_drv.c            |  2 +-
> >  drivers/input/mouse/vmmouse.c     | 10 ++++------
> 
> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Acked-by: K. Y. Srinivasan <kys@microsoft.com>

> 
> >  drivers/misc/vmw_balloon.c        |  2 +-
> >  11 files changed, 40 insertions(+), 31 deletions(-)
> >
> > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> > index a5db63f728a2..a0b86cf486e0 100644
> > --- a/arch/x86/hyperv/hv_init.c
> > +++ b/arch/x86/hyperv/hv_init.c
> > @@ -113,7 +113,7 @@ void hyperv_init(void)
> >  	u64 guest_id;
> >  	union hv_x64_msr_hypercall_contents hypercall_msr;
> >
> > -	if (x86_hyper != &x86_hyper_ms_hyperv)
> > +	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
> >  		return;
> >
> >  	/* Allocate percpu VP index */
> > diff --git a/arch/x86/include/asm/hypervisor.h
> b/arch/x86/include/asm/hypervisor.h
> > index 0eca7239a7aa..1b0a5abcd8ae 100644
> > --- a/arch/x86/include/asm/hypervisor.h
> > +++ b/arch/x86/include/asm/hypervisor.h
> > @@ -29,6 +29,16 @@
> >  /*
> >   * x86 hypervisor information
> >   */
> > +
> > +enum x86_hypervisor_type {
> > +	X86_HYPER_NATIVE = 0,
> > +	X86_HYPER_VMWARE,
> > +	X86_HYPER_MS_HYPERV,
> > +	X86_HYPER_XEN_PV,
> > +	X86_HYPER_XEN_HVM,
> > +	X86_HYPER_KVM,
> > +};
> > +
> >  struct hypervisor_x86 {
> >  	/* Hypervisor name */
> >  	const char	*name;
> > @@ -36,6 +46,9 @@ struct hypervisor_x86 {
> >  	/* Detection routine */
> >  	uint32_t	(*detect)(void);
> >
> > +	/* Hypervisor type */
> > +	enum x86_hypervisor_type type;
> > +
> >  	/* init time callbacks */
> >  	struct x86_hyper_init init;
> >
> > @@ -43,15 +56,7 @@ struct hypervisor_x86 {
> >  	struct x86_hyper_runtime runtime;
> >  };
> >
> > -extern const struct hypervisor_x86 *x86_hyper;
> > -
> > -/* Recognized hypervisors */
> > -extern const struct hypervisor_x86 x86_hyper_vmware;
> > -extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
> > -extern const struct hypervisor_x86 x86_hyper_xen_pv;
> > -extern const struct hypervisor_x86 x86_hyper_xen_hvm;
> > -extern const struct hypervisor_x86 x86_hyper_kvm;
> > -
> > +extern enum x86_hypervisor_type x86_hyper_type;
> >  extern void init_hypervisor_platform(void);
> >  #else
> >  static inline void init_hypervisor_platform(void) { }
> > diff --git a/arch/x86/kernel/cpu/hypervisor.c
> b/arch/x86/kernel/cpu/hypervisor.c
> > index 22226c1bf092..bea8d3e24f50 100644
> > --- a/arch/x86/kernel/cpu/hypervisor.c
> > +++ b/arch/x86/kernel/cpu/hypervisor.c
> > @@ -26,6 +26,12 @@
> >  #include <asm/processor.h>
> >  #include <asm/hypervisor.h>
> >
> > +extern const struct hypervisor_x86 x86_hyper_vmware;
> > +extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
> > +extern const struct hypervisor_x86 x86_hyper_xen_pv;
> > +extern const struct hypervisor_x86 x86_hyper_xen_hvm;
> > +extern const struct hypervisor_x86 x86_hyper_kvm;
> > +
> >  static const __initconst struct hypervisor_x86 * const hypervisors[] =
> >  {
> >  #ifdef CONFIG_XEN_PV
> > @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const
> hypervisors[] =
> >  #endif
> >  };
> >
> > -const struct hypervisor_x86 *x86_hyper;
> > -EXPORT_SYMBOL(x86_hyper);
> > +enum x86_hypervisor_type x86_hyper_type;
> > +EXPORT_SYMBOL(x86_hyper_type);
> >
> >  static inline const struct hypervisor_x86 * __init
> >  detect_hypervisor_vendor(void)
> > @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void)
> >  	copy_array(&h->init, &x86_init.hyper, sizeof(h->init));
> >  	copy_array(&h->runtime, &x86_platform.hyper, sizeof(h-
> >runtime));
> >
> > -	x86_hyper = h;
> > +	x86_hyper_type = h->type;
> >  	x86_init.hyper.init_platform();
> >  }
> > diff --git a/arch/x86/kernel/cpu/mshyperv.c
> b/arch/x86/kernel/cpu/mshyperv.c
> > index 6bb84d655e4b..85eb5fc180c8 100644
> > --- a/arch/x86/kernel/cpu/mshyperv.c
> > +++ b/arch/x86/kernel/cpu/mshyperv.c
> > @@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void)
> >  #endif
> >  }
> >
> > -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
> > +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
> >  	.name			= "Microsoft Hyper-V",
> >  	.detect			= ms_hyperv_platform,
> > +	.type			= X86_HYPER_MS_HYPERV,
> >  	.init.init_platform	= ms_hyperv_init_platform,
> >  };
> > -EXPORT_SYMBOL(x86_hyper_ms_hyperv);
> > diff --git a/arch/x86/kernel/cpu/vmware.c
> b/arch/x86/kernel/cpu/vmware.c
> > index 4804c1d063c8..8e005329648b 100644
> > --- a/arch/x86/kernel/cpu/vmware.c
> > +++ b/arch/x86/kernel/cpu/vmware.c
> > @@ -205,10 +205,10 @@ static bool __init
> vmware_legacy_x2apic_available(void)
> >  	       (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0;
> >  }
> >
> > -const __refconst struct hypervisor_x86 x86_hyper_vmware = {
> > +const __initconst struct hypervisor_x86 x86_hyper_vmware = {
> >  	.name			= "VMware",
> >  	.detect			= vmware_platform,
> > +	.type			= X86_HYPER_VMWARE,
> >  	.init.init_platform	= vmware_platform_setup,
> >  	.init.x2apic_available	= vmware_legacy_x2apic_available,
> >  };
> > -EXPORT_SYMBOL(x86_hyper_vmware);
> > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> > index 9dca8437c795..a94de09edbed 100644
> > --- a/arch/x86/kernel/kvm.c
> > +++ b/arch/x86/kernel/kvm.c
> > @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void)
> >  	return kvm_cpuid_base();
> >  }
> >
> > -const struct hypervisor_x86 x86_hyper_kvm __refconst = {
> > +const __initconst struct hypervisor_x86 x86_hyper_kvm = {
> >  	.name			= "KVM",
> >  	.detect			= kvm_detect,
> > +	.type			= X86_HYPER_KVM,
> >  	.init.x2apic_available	= kvm_para_available,
> >  };
> > -EXPORT_SYMBOL_GPL(x86_hyper_kvm);
> >
> >  static __init int activate_jump_labels(void)
> >  {
> > diff --git a/arch/x86/xen/enlighten_hvm.c
> b/arch/x86/xen/enlighten_hvm.c
> > index 7b1622089f96..754d5391d9fa 100644
> > --- a/arch/x86/xen/enlighten_hvm.c
> > +++ b/arch/x86/xen/enlighten_hvm.c
> > @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void)
> >  	return xen_cpuid_base();
> >  }
> >
> > -const struct hypervisor_x86 x86_hyper_xen_hvm = {
> > +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = {
> >  	.name                   = "Xen HVM",
> >  	.detect                 = xen_platform_hvm,
> > +	.type			= X86_HYPER_XEN_HVM,
> >  	.init.init_platform     = xen_hvm_guest_init,
> >  	.init.x2apic_available  = xen_x2apic_para_available,
> >  	.init.init_mem_mapping	= xen_hvm_init_mem_mapping,
> >  	.runtime.pin_vcpu       = xen_pin_vcpu,
> >  };
> > -EXPORT_SYMBOL(x86_hyper_xen_hvm);
> > diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
> > index 69d1a7054ddb..168efb2534c0 100644
> > --- a/arch/x86/xen/enlighten_pv.c
> > +++ b/arch/x86/xen/enlighten_pv.c
> > @@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void)
> >  	return 0;
> >  }
> >
> > -const struct hypervisor_x86 x86_hyper_xen_pv = {
> > +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = {
> >  	.name                   = "Xen PV",
> >  	.detect                 = xen_platform_pv,
> > +	.type			= X86_HYPER_XEN_PV,
> >  	.runtime.pin_vcpu       = xen_pin_vcpu,
> >  };
> > -EXPORT_SYMBOL(x86_hyper_xen_pv);
> > diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> > index 937801ac2fe0..2cd134dd94d2 100644
> > --- a/drivers/hv/vmbus_drv.c
> > +++ b/drivers/hv/vmbus_drv.c
> > @@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void)
> >  {
> >  	int ret, t;
> >
> > -	if (x86_hyper != &x86_hyper_ms_hyperv)
> > +	if (x86_hyper_type != X86_HYPER_MS_HYPERV)
> >  		return -ENODEV;
> >
> >  	init_completion(&probe_event);
> > diff --git a/drivers/input/mouse/vmmouse.c
> b/drivers/input/mouse/vmmouse.c
> > index 0f586780ceb4..1ae5c1ef3f5b 100644
> > --- a/drivers/input/mouse/vmmouse.c
> > +++ b/drivers/input/mouse/vmmouse.c
> > @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse
> *psmouse)
> >  /*
> >   * Array of supported hypervisors.
> >   */
> > -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] =
> {
> > -	&x86_hyper_vmware,
> > -#ifdef CONFIG_KVM_GUEST
> > -	&x86_hyper_kvm,
> > -#endif
> > +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = {
> > +	X86_HYPER_VMWARE,
> > +	X86_HYPER_KVM,
> >  };
> >
> >  /**
> > @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void)
> >  	int i;
> >
> >  	for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++)
> > -		if (vmmouse_supported_hypervisors[i] == x86_hyper)
> > +		if (vmmouse_supported_hypervisors[i] == x86_hyper_type)
> >  			return true;
> >
> >  	return false;
> > diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
> > index 1e688bfec567..9047c0a529b2 100644
> > --- a/drivers/misc/vmw_balloon.c
> > +++ b/drivers/misc/vmw_balloon.c
> > @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void)
> >  	 * Check if we are running on VMware's hypervisor and bail out
> >  	 * if we are not.
> >  	 */
> > -	if (x86_hyper != &x86_hyper_vmware)
> > +	if (x86_hyper_type != X86_HYPER_VMWARE)
> >  		return -ENODEV;
> >
> >  	for (is_2m_pages = 0; is_2m_pages <
> VMW_BALLOON_NUM_PAGE_SIZES;
> > --
> > 2.12.3
> >
> 
> --
> Dmitry

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-11-10 20:39 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-09 13:27 [PATCH v2 0/5] x86/xen: support booting PVH guest via standard boot path Juergen Gross
2017-11-09 13:27 ` [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper Juergen Gross
2017-11-09 17:57   ` Xavier Deguillard
2017-11-10 18:26   ` Dmitry Torokhov
2017-11-10 20:39     ` KY Srinivasan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).