mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
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:
parent
4ec426b975
commit
5f1c788ca9
@ -91,12 +91,12 @@
|
|||||||
<row>
|
<row>
|
||||||
<entry valign="top" morerows="10">VM</entry>
|
<entry valign="top" morerows="10">VM</entry>
|
||||||
<entry><varname>qemu</varname></entry>
|
<entry><varname>qemu</varname></entry>
|
||||||
<entry>QEMU software virtualization</entry>
|
<entry>QEMU software virtualization, without KVM</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
<entry><varname>kvm</varname></entry>
|
<entry><varname>kvm</varname></entry>
|
||||||
<entry>Linux KVM kernel virtual machine</entry>
|
<entry>Linux KVM kernel virtual machine, from within QEMU</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
|
@ -316,25 +316,31 @@ static int detect_vm_zvm(void) {
|
|||||||
/* Returns a short identifier for the various VM implementations */
|
/* Returns a short identifier for the various VM implementations */
|
||||||
int detect_vm(void) {
|
int detect_vm(void) {
|
||||||
static thread_local int cached_found = _VIRTUALIZATION_INVALID;
|
static thread_local int cached_found = _VIRTUALIZATION_INVALID;
|
||||||
int r;
|
int r, cpuid;
|
||||||
|
|
||||||
if (cached_found >= 0)
|
if (cached_found >= 0)
|
||||||
return cached_found;
|
return cached_found;
|
||||||
|
|
||||||
/* We have to use the correct order here:
|
/* 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.
|
* -> First try to detect qemu/kvm and return 'kvm'.
|
||||||
* Detection via DMI works corretly, the CPU ID would find KVM
|
* -> Some virtualization technologies do use KVM hypervisor but are
|
||||||
* only. */
|
* 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();
|
r = detect_vm_dmi();
|
||||||
|
|
||||||
|
if (r == VIRTUALIZATION_QEMU && cpuid == VIRTUALIZATION_KVM)
|
||||||
|
return cpuid;
|
||||||
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
if (r != VIRTUALIZATION_NONE)
|
if (r != VIRTUALIZATION_NONE)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
r = detect_vm_cpuid();
|
r = cpuid;
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
if (r != VIRTUALIZATION_NONE)
|
if (r != VIRTUALIZATION_NONE)
|
||||||
|
Loading…
Reference in New Issue
Block a user