|
|
|
From fa2237b9987c39147704274937895547c8c8d647 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Andrew Jones <drjones@redhat.com>
|
|
|
|
Date: Tue, 31 Mar 2015 11:08:13 +0200
|
|
|
|
Subject: [PATCH] ARM: detect-virt: detect QEMU/KVM
|
|
|
|
|
|
|
|
QEMU/KVM guests do not have hypervisor nodes, but they do have
|
|
|
|
fw-cfg nodes (since qemu v2.3.0-rc0). fw-cfg nodes are documented,
|
|
|
|
see kernel doc Documentation/devicetree/bindings/arm/fw-cfg.txt,
|
|
|
|
and therefore we should be able to rely on it in this detection.
|
|
|
|
|
|
|
|
Unfortunately, we currently don't have enough information in the
|
|
|
|
DT, or elsewhere, to determine if we're using KVM acceleration
|
|
|
|
with QEMU or not, so we can only report 'qemu' at this time, even
|
|
|
|
if KVM is in use. This shouldn't really matter in practice though,
|
|
|
|
because if detect-virt is used interactively it will be clear to
|
|
|
|
the user whether or not KVM acceleration is present by the overall
|
|
|
|
speed of the guest. If used by a script, then the script's behavior
|
|
|
|
should not change whether it's 'qemu' or 'kvm'. QEMU emulated
|
|
|
|
guests and QEMU/KVM guests of the same type should behave
|
|
|
|
identically, only the speed at which they run should differ.
|
|
|
|
|
|
|
|
Cherry-picked from: ce09c71d56a11
|
|
|
|
Resolves: #1207773
|
|
|
|
---
|
|
|
|
src/shared/virt.c | 17 +++++++++++++++++
|
|
|
|
1 file changed, 17 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/src/shared/virt.c b/src/shared/virt.c
|
|
|
|
index 712523210d..54c465520d 100644
|
|
|
|
--- a/src/shared/virt.c
|
|
|
|
+++ b/src/shared/virt.c
|
|
|
|
@@ -115,6 +115,23 @@ static int detect_vm_devicetree(const char **_id) {
|
|
|
|
*_id = "xen";
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
+ } else if (r == -ENOENT) {
|
|
|
|
+ _cleanup_closedir_ DIR *dir = NULL;
|
|
|
|
+ struct dirent *dent;
|
|
|
|
+
|
|
|
|
+ dir = opendir("/proc/device-tree");
|
|
|
|
+ if (!dir) {
|
|
|
|
+ if (errno == ENOENT)
|
|
|
|
+ return 0;
|
|
|
|
+ return -errno;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FOREACH_DIRENT(dent, dir, return -errno) {
|
|
|
|
+ if (strstr(dent->d_name, "fw-cfg")) {
|
|
|
|
+ *_id = "qemu";
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return 0;
|