The cgroups code currently tries to use machined and then falls back to
using the cgroups filesystem directly. This introduces a new enum that
allows callers to have explicit control over which impl is used.

Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
---
 src/lxc/lxc_cgroup.c   |  1 +
 src/qemu/qemu_cgroup.c |  1 +
 src/util/vircgroup.c   | 57 ++++++++++++++++++++++++++----------------
 src/util/vircgroup.h   |  7 ++++++
 4 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
index 326d33981c..629f9eca1c 100644
--- a/src/lxc/lxc_cgroup.c
+++ b/src/lxc/lxc_cgroup.c
@@ -414,6 +414,7 @@ virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def,
                             initpid,
                             true,
                             nnicindexes, nicindexes,
+                            VIR_CGROUP_REGISTER_DEFAULT,
                             def->resource->partition,
                             -1,
                             0,
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index c407431f6b..cd7c381185 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -968,6 +968,7 @@ qemuInitCgroup(virDomainObjPtr vm,
                             vm->pid,
                             false,
                             nnicindexes, nicindexes,
+                            VIR_CGROUP_REGISTER_DEFAULT,
                             vm->def->resource->partition,
                             cfg->cgroupControllers,
                             cfg->maxThreadsPerProc,
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index 70d85200cb..0128c8bb60 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -1228,6 +1228,7 @@ virCgroupNewMachine(const char *name,
                     bool isContainer,
                     size_t nnicindexes,
                     int *nicindexes,
+                    virCgroupRegister *reg,
                     const char *partition,
                     int controllers,
                     unsigned int maxthreads,
@@ -1237,29 +1238,43 @@ virCgroupNewMachine(const char *name,
 
     *group = NULL;
 
-    if ((rv = virCgroupNewMachineSystemd(name,
-                                         drivername,
-                                         uuid,
-                                         rootdir,
-                                         pidleader,
-                                         isContainer,
-                                         nnicindexes,
-                                         nicindexes,
-                                         partition,
-                                         controllers,
-                                         maxthreads,
-                                         group)) == 0)
-        return 0;
+    if (*reg == VIR_CGROUP_REGISTER_DEFAULT ||
+        *reg == VIR_CGROUP_REGISTER_MACHINED) {
+        if ((rv = virCgroupNewMachineSystemd(name,
+                                             drivername,
+                                             uuid,
+                                             rootdir,
+                                             pidleader,
+                                             isContainer,
+                                             nnicindexes,
+                                             nicindexes,
+                                             partition,
+                                             controllers,
+                                             maxthreads,
+                                             group)) == 0) {
+            *reg = VIR_CGROUP_REGISTER_MACHINED;
+            return 0;
+        }
 
-    if (rv == -1)
-        return -1;
+        if (rv == -1)
+            return -1;
+
+        if (*reg == VIR_CGROUP_REGISTER_MACHINED) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           "%s", _("Systemd machined requested, but not 
available"));
+            return -1;
+        }
+    }
 
-    return virCgroupNewMachineManual(name,
-                                     drivername,
-                                     pidleader,
-                                     partition,
-                                     controllers,
-                                     group);
+    rv = virCgroupNewMachineManual(name,
+                                   drivername,
+                                   pidleader,
+                                   partition,
+                                   controllers,
+                                   group);
+    if (rv == 0)
+        *reg = VIR_CGROUP_REGISTER_DIRECT;
+    return rv;
 }
 
 
diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h
index 1dcd0688f1..b725bc4c94 100644
--- a/src/util/vircgroup.h
+++ b/src/util/vircgroup.h
@@ -87,6 +87,12 @@ virCgroupNewDetectMachine(const char *name,
                           virCgroupPtr *group)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+typedef enum {
+    VIR_CGROUP_REGISTER_DEFAULT,
+    VIR_CGROUP_REGISTER_DIRECT,
+    VIR_CGROUP_REGISTER_MACHINED,
+} virCgroupRegister;
+
 int virCgroupNewMachine(const char *name,
                         const char *drivername,
                         const unsigned char *uuid,
@@ -95,6 +101,7 @@ int virCgroupNewMachine(const char *name,
                         bool isContainer,
                         size_t nnicindexes,
                         int *nicindexes,
+                        virCgroupRegister *reg,
                         const char *partition,
                         int controllers,
                         unsigned int maxthreads,
-- 
2.24.1

Reply via email to