dcavalca / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
Zbigniew Jędrzejewski-Szmek 7f93bc
From dfef23e1b6c0c89b17b7b52f6ec1537649a8c60b Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek a59965
From: Thomas Blume <Thomas.Blume@suse.com>
Zbigniew Jędrzejewski-Szmek a59965
Date: Fri, 6 Jun 2014 16:36:45 +0200
Zbigniew Jędrzejewski-Szmek a59965
Subject: [PATCH] systemd-detect-virt: only discover Xen domU
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
The current vm detection lacks the distinction between Xen dom0 and Xen domU.
Zbigniew Jędrzejewski-Szmek a59965
Both, dom0 and domU are running inside the hypervisor.
Zbigniew Jędrzejewski-Szmek a59965
Therefore systemd-detect-virt and the ConditionVirtualization directive detect
Zbigniew Jędrzejewski-Szmek a59965
dom0 as a virtual machine.
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
dom0 is not using virtual devices but is accessing the real hardware.
Zbigniew Jędrzejewski-Szmek a59965
Therefore dom0 should be considered the virtualisation host and not a virtual
Zbigniew Jędrzejewski-Szmek a59965
machine.
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
https://bugs.freedesktop.org/show_bug.cgi?id=77271
Zbigniew Jędrzejewski-Szmek a59965
(cherry picked from commit 37287585b6ba9a55065c8f94458f6db3c0abe0af)
Zbigniew Jędrzejewski-Szmek a59965
(cherry picked from commit f22d2ebe687ad842f4bed11df918ed07a0bb3e78)
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
Conflicts:
Zbigniew Jędrzejewski-Szmek a59965
	src/shared/virt.c
Zbigniew Jędrzejewski-Szmek a59965
---
Zbigniew Jędrzejewski-Szmek a59965
 src/shared/virt.c | 34 +++++++++++++++++++++++++++-------
Zbigniew Jędrzejewski-Szmek a59965
 1 file changed, 27 insertions(+), 7 deletions(-)
Zbigniew Jędrzejewski-Szmek a59965
Zbigniew Jędrzejewski-Szmek a59965
diff --git a/src/shared/virt.c b/src/shared/virt.c
Zbigniew Jędrzejewski-Szmek a59965
index 4e18638..e59f2b1 100644
Zbigniew Jędrzejewski-Szmek a59965
--- a/src/shared/virt.c
Zbigniew Jędrzejewski-Szmek a59965
+++ b/src/shared/virt.c
Zbigniew Jędrzejewski-Szmek a59965
@@ -149,7 +149,7 @@ static int detect_vm_dmi(const char **_id) {
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
 /* Returns a short identifier for the various VM implementations */
Zbigniew Jędrzejewski-Szmek a59965
 int detect_vm(const char **id) {
Zbigniew Jędrzejewski-Szmek a59965
-        _cleanup_free_ char *hvtype = NULL, *cpuinfo_contents = NULL;
Zbigniew Jędrzejewski-Szmek a59965
+        _cleanup_free_ char *domcap = NULL, *cpuinfo_contents = NULL;
Zbigniew Jędrzejewski-Szmek a59965
         static __thread int cached_found = -1;
Zbigniew Jędrzejewski-Szmek a59965
         static __thread const char *cached_id = NULL;
Zbigniew Jędrzejewski-Szmek a59965
         const char *_id = NULL;
Zbigniew Jędrzejewski-Szmek a59965
@@ -163,17 +163,37 @@ int detect_vm(const char **id) {
Zbigniew Jędrzejewski-Szmek a59965
                 return cached_found;
Zbigniew Jędrzejewski-Szmek a59965
         }
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
-        /* Try high-level hypervisor sysfs file first:
Zbigniew Jędrzejewski-Szmek a59965
+        /* Try xen capabilities file first, if not found try high-level hypervisor sysfs file:
Zbigniew Jędrzejewski-Szmek a59965
          *
Zbigniew Jędrzejewski-Szmek a59965
-         * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
Zbigniew Jędrzejewski-Szmek a59965
-        r = read_one_line_file("/sys/hypervisor/type", &hvtype);
Zbigniew Jędrzejewski-Szmek a59965
+         * https://bugs.freedesktop.org/show_bug.cgi?id=77271 */
Zbigniew Jędrzejewski-Szmek a59965
+        r = read_one_line_file("/proc/xen/capabilities", &domcap);
Zbigniew Jędrzejewski-Szmek a59965
         if (r >= 0) {
Zbigniew Jędrzejewski-Szmek a59965
-                if (streq(hvtype, "xen")) {
Zbigniew Jędrzejewski-Szmek a59965
+                char *cap, *i = domcap;
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                while ((cap = strsep(&i, ",")))
Zbigniew Jędrzejewski-Szmek a59965
+                        if (streq(cap, "control_d"))
Zbigniew Jędrzejewski-Szmek a59965
+                                break;
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                if (!i)  {
Zbigniew Jędrzejewski-Szmek a59965
                         _id = "xen";
Zbigniew Jędrzejewski-Szmek a59965
                         r = 1;
Zbigniew Jędrzejewski-Szmek a59965
-                        goto finish;
Zbigniew Jędrzejewski-Szmek a59965
                 }
Zbigniew Jędrzejewski-Szmek a59965
-        } else if (r != -ENOENT)
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                goto finish;
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+        } else if (r == -ENOENT) {
Zbigniew Jędrzejewski-Szmek a59965
+                _cleanup_free_ char *hvtype = NULL;
Zbigniew Jędrzejewski-Szmek a59965
+
Zbigniew Jędrzejewski-Szmek a59965
+                r = read_one_line_file("/sys/hypervisor/type", &hvtype);
Zbigniew Jędrzejewski-Szmek a59965
+                if (r >= 0) {
Zbigniew Jędrzejewski-Szmek a59965
+                        if (streq(hvtype, "xen")) {
Zbigniew Jędrzejewski-Szmek a59965
+                                _id = "xen";
Zbigniew Jędrzejewski-Szmek a59965
+                                r = 1;
Zbigniew Jędrzejewski-Szmek a59965
+                                goto finish;
Zbigniew Jędrzejewski-Szmek a59965
+                        }
Zbigniew Jędrzejewski-Szmek a59965
+                } else if (r != -ENOENT)
Zbigniew Jędrzejewski-Szmek a59965
+                        return r;
Zbigniew Jędrzejewski-Szmek a59965
+        } else
Zbigniew Jędrzejewski-Szmek a59965
                 return r;
Zbigniew Jędrzejewski-Szmek a59965
 
Zbigniew Jędrzejewski-Szmek a59965
         /* this will set _id to "other" and return 0 for unknown hypervisors */