virt: detect qemu/kvm as 'kvm'

In commit 050e65a we swapped order of detect_vm_{cpuid,dmi}(). That
fixed Virtualbox but broke qemu with kvm, which is expected to return
'kvm'. So check for qemu/kvm first, then DMI, CPUID last.

This fixes #5318.

Signed-off-by: Christian Hesse <mail@eworm.de>
This commit is contained in:
Christian Hesse 2017-02-14 14:51:12 +01:00
parent 4ec426b975
commit 5f1c788ca9
2 changed files with 15 additions and 9 deletions

View file

@ -91,12 +91,12 @@
<row>
<entry valign="top" morerows="10">VM</entry>
<entry><varname>qemu</varname></entry>
<entry>QEMU software virtualization</entry>
<entry>QEMU software virtualization, without KVM</entry>
</row>
<row>
<entry><varname>kvm</varname></entry>
<entry>Linux KVM kernel virtual machine</entry>
<entry>Linux KVM kernel virtual machine, from within QEMU</entry>
</row>
<row>

View file

@ -316,25 +316,31 @@ static int detect_vm_zvm(void) {
/* Returns a short identifier for the various VM implementations */
int detect_vm(void) {
static thread_local int cached_found = _VIRTUALIZATION_INVALID;
int r;
int r, cpuid;
if (cached_found >= 0)
return cached_found;
/* We have to use the correct order here:
* Some virtualization technologies do use KVM hypervisor but are
* expected to be detected as something else. So detect DMI first.
*
* An example is Virtualbox since version 5.0, which uses KVM backend.
* Detection via DMI works corretly, the CPU ID would find KVM
* only. */
* -> First try to detect qemu/kvm and return 'kvm'.
* -> Some virtualization technologies do use KVM hypervisor but are
* expected to be detected as something else. Virtualbox since
* version 5.0 is an example. So detect DMI next.
* -> Get infos from CPUID third. */
cpuid = detect_vm_cpuid();
r = detect_vm_dmi();
if (r == VIRTUALIZATION_QEMU && cpuid == VIRTUALIZATION_KVM)
return cpuid;
if (r < 0)
return r;
if (r != VIRTUALIZATION_NONE)
goto finish;
r = detect_vm_cpuid();
r = cpuid;
if (r < 0)
return r;
if (r != VIRTUALIZATION_NONE)