Skip to content

Commit

Permalink
virt: detect qemu/kvm as 'kvm'
Browse files Browse the repository at this point in the history
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 systemd#5318.

Signed-off-by: Christian Hesse <[email protected]>
  • Loading branch information
eworm-de committed Feb 14, 2017
1 parent 4ec426b commit 5f1c788
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 9 deletions.
4 changes: 2 additions & 2 deletions man/systemd-detect-virt.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
20 changes: 13 additions & 7 deletions src/basic/virt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 5f1c788

Please sign in to comment.