[libvirt PATCH 05/25] vircgroupv2: properly detect placement of running VM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When libvirtd starts a VM it internally stores a path to the main
cgroup. When we restart libvirtd we should get to the same state.

When we start a VM on host with systemd the cgroup is created for us and
the process is already placed into that cgroup and we detect the path
created by systemd using /proc/$PID/cgroup. After that we create
sub-cgroups and move all threads there.

Once libvirtd is restarted we again detect the cgroup path using
/proc/$PID/cgroup, but in this case we will get a different path because
the main thread was moved to a "emulator" cgroup.

Instead of ignoring the "emulator" directory when validating cgroups
remove it completely when detecting cgroup otherwise cgroups will not
work properly when libvirtd is restarted.

Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx>
---
 src/util/vircgroupv2.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 65f5cc6bd0..fb97b7fd2a 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -122,12 +122,6 @@ virCgroupV2ValidateMachineGroup(virCgroupPtr group,
     if (!(tmp = strrchr(group->unified.placement, '/')))
         return false;
 
-    if (STREQ(tmp, "/emulator")) {
-        *tmp = '\0';
-
-        if (!(tmp = strrchr(group->unified.placement, '/')))
-            return false;
-    }
     tmp++;
 
     if (STRNEQ(tmp, partmachinename) &&
@@ -198,6 +192,9 @@ virCgroupV2DetectPlacement(virCgroupPtr group,
                            const char *controllers,
                            const char *selfpath)
 {
+    g_autofree char *placement = g_strdup(selfpath);
+    char *tmp = NULL;
+
     if (group->unified.placement)
         return 0;
 
@@ -208,12 +205,18 @@ virCgroupV2DetectPlacement(virCgroupPtr group,
     if (STRNEQ(controllers, ""))
         return 0;
 
+    /* Running VM will have the main thread placed in emulator cgroup
+     * but we need to get the main cgroup. */
+    tmp = g_strrstr(placement, "/emulator");
+    if (tmp)
+        *tmp = '\0';
+
     /*
      * selfpath == "/" + path="" -> "/"
      * selfpath == "/libvirt.service" + path == "" -> "/libvirt.service"
      * selfpath == "/libvirt.service" + path == "foo" -> "/libvirt.service/foo"
      */
-    group->unified.placement = g_strdup_printf("%s%s%s", selfpath,
+    group->unified.placement = g_strdup_printf("%s%s%s", placement,
                                                (STREQ(selfpath, "/") || STREQ(path, "") ? "" : "/"), path);
 
     return 0;
-- 
2.26.2




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux