summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Jones <drjones@redhat.com>2015-03-31 11:08:13 +0200
committerLennart Poettering <lennart@poettering.net>2015-03-31 15:36:53 +0200
commitce09c71d56a11a4e4cd1df001737e913720c1118 (patch)
tree1b94b1f1e944efcbd4767b19be90399715e4e7dd
parentdb6a86897efb337100165c017da81cc70fac51e2 (diff)
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.
-rw-r--r--src/shared/virt.c17
1 files changed, 17 insertions, 0 deletions
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;