dryang / rpms / systemd

Forked from rpms/systemd a year ago
Clone
Blob Blame History Raw
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 712523210..54c465520 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;