Skip to content

Commit

Permalink
hv: vmbus_drv: detect hyperv through x86_hyper
Browse files Browse the repository at this point in the history
There are two reasons we need to use x86_hyper instead of
query_hypervisor_presence():

- Not only hyperv but also other hypervisors such as kvm would set
  X86_FEATURE_HYTPERVISOR, so query_hypervisor_presence() will return true even
  in kvm. This may cause extra delay of 5 seconds before failing the probing in
  kvm guest.
- The hypervisor has been detected in init_hypervisor(), so no need to do the
  work again.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Acked-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Jason Wang authored and Greg Kroah-Hartman committed Sep 4, 2012
1 parent 82aceae commit 1f94ea8
Showing 1 changed file with 2 additions and 23 deletions.
25 changes: 2 additions & 23 deletions drivers/hv/vmbus_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <linux/completion.h>
#include <linux/hyperv.h>
#include <asm/hyperv.h>
#include <asm/hypervisor.h>
#include "hyperv_vmbus.h"


Expand Down Expand Up @@ -719,33 +720,11 @@ static struct acpi_driver vmbus_acpi_driver = {
},
};

/*
* query_hypervisor_presence
* - Query the cpuid for presence of windows hypervisor
*/
static int query_hypervisor_presence(void)
{
unsigned int eax;
unsigned int ebx;
unsigned int ecx;
unsigned int edx;
unsigned int op;

eax = 0;
ebx = 0;
ecx = 0;
edx = 0;
op = HVCPUID_VERSION_FEATURES;
cpuid(op, &eax, &ebx, &ecx, &edx);

return ecx & HV_PRESENT_BIT;
}

static int __init hv_acpi_init(void)
{
int ret, t;

if (!query_hypervisor_presence())
if (x86_hyper != &x86_hyper_ms_hyperv)
return -ENODEV;

init_completion(&probe_event);
Expand Down

0 comments on commit 1f94ea8

Please sign in to comment.