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(a)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