[libvirt PATCH 20/25] vircgroup: introduce virCgroupSetPlacement

Pavel Hrdina phrdina at redhat.com
Tue Nov 3 12:41:32 UTC 2020


Currently this task is done by virCgroupCopyPlacement when the @path
starts with "/".

virCgroupNew is always called with @path starting with "/" and there is
no parent to copy path from. To make it obvious what the code is doing
introduce new helper.

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 src/util/vircgroup.c        | 19 ++++++++++++++++++-
 src/util/vircgroupbackend.h |  5 +++++
 src/util/vircgroupv1.c      | 21 +++++++++++++++++++++
 src/util/vircgroupv2.c      | 11 +++++++++++
 4 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index 6a34eb4037..00967ea5fa 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -393,6 +393,23 @@ virCgroupDetectPlacement(virCgroupPtr group,
 }
 
 
+static int
+virCgroupSetPlacement(virCgroupPtr group,
+                      const char *path)
+{
+    size_t i;
+
+    for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
+        if (group->backends[i] &&
+            group->backends[i]->setPlacement(group, path) < 0) {
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
 static int
 virCgroupValidatePlacement(virCgroupPtr group,
                            pid_t pid)
@@ -689,7 +706,7 @@ virCgroupNew(const char *path,
     if (virCgroupDetectMounts(newGroup) < 0)
         return -1;
 
-    if (virCgroupCopyPlacement(newGroup, path, NULL) < 0)
+    if (virCgroupSetPlacement(newGroup, path) < 0)
         return -1;
 
     /* ... but use /proc/cgroups to fill in the rest */
diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h
index f677157a91..4ca2e38af2 100644
--- a/src/util/vircgroupbackend.h
+++ b/src/util/vircgroupbackend.h
@@ -88,6 +88,10 @@ typedef int
                               const char *controllers,
                               const char *selfpath);
 
+typedef int
+(*virCgroupSetPlacementCB)(virCgroupPtr group,
+                           const char *path);
+
 typedef int
 (*virCgroupValidatePlacementCB)(virCgroupPtr group,
                                 pid_t pid);
@@ -369,6 +373,7 @@ struct _virCgroupBackend {
     virCgroupCopyPlacementCB copyPlacement;
     virCgroupDetectMountsCB detectMounts;
     virCgroupDetectPlacementCB detectPlacement;
+    virCgroupSetPlacementCB setPlacement;
     virCgroupValidatePlacementCB validatePlacement;
     virCgroupStealPlacementCB stealPlacement;
     virCgroupDetectControllersCB detectControllers;
diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c
index 98b5aa047d..ed4b0813f2 100644
--- a/src/util/vircgroupv1.c
+++ b/src/util/vircgroupv1.c
@@ -364,6 +364,26 @@ virCgroupV1DetectPlacement(virCgroupPtr group,
 }
 
 
+static int
+virCgroupV1SetPlacement(virCgroupPtr group,
+                        const char *path)
+{
+    size_t i;
+
+    for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
+        if (!group->legacy[i].mountPoint)
+            continue;
+
+        if (i == VIR_CGROUP_CONTROLLER_SYSTEMD)
+            continue;
+
+        group->legacy[i].placement = g_strdup(path);
+    }
+
+    return 0;
+}
+
+
 static int
 virCgroupV1ValidatePlacement(virCgroupPtr group,
                              pid_t pid)
@@ -2101,6 +2121,7 @@ virCgroupBackend virCgroupV1Backend = {
     .copyPlacement = virCgroupV1CopyPlacement,
     .detectMounts = virCgroupV1DetectMounts,
     .detectPlacement = virCgroupV1DetectPlacement,
+    .setPlacement = virCgroupV1SetPlacement,
     .validatePlacement = virCgroupV1ValidatePlacement,
     .stealPlacement = virCgroupV1StealPlacement,
     .detectControllers = virCgroupV1DetectControllers,
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 0467a72566..8e058ca9c6 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -223,6 +223,16 @@ virCgroupV2DetectPlacement(virCgroupPtr group,
 }
 
 
+static int
+virCgroupV2SetPlacement(virCgroupPtr group,
+                        const char *path)
+{
+    group->unified.placement = g_strdup(path);
+
+    return 0;
+}
+
+
 static int
 virCgroupV2ValidatePlacement(virCgroupPtr group,
                              pid_t pid G_GNUC_UNUSED)
@@ -1845,6 +1855,7 @@ virCgroupBackend virCgroupV2Backend = {
     .copyPlacement = virCgroupV2CopyPlacement,
     .detectMounts = virCgroupV2DetectMounts,
     .detectPlacement = virCgroupV2DetectPlacement,
+    .setPlacement = virCgroupV2SetPlacement,
     .validatePlacement = virCgroupV2ValidatePlacement,
     .stealPlacement = virCgroupV2StealPlacement,
     .detectControllers = virCgroupV2DetectControllers,
-- 
2.26.2




More information about the libvir-list mailing list