<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 18, 2018 at 5:45 PM, Pavel Hrdina <span dir="ltr"><<a href="mailto:phrdina@redhat.com" target="_blank">phrdina@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Pavel Hrdina <<a href="mailto:phrdina@redhat.com" target="_blank">phrdina@redhat.com</a>><br></blockquote><div><br></div><div>Reviewed-by: Fabiano Fidêncio <<a href="mailto:fidencio@redhat.com" target="_blank">fidencio@redhat.com</a>><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
 src/util/vircgroup.c        | 141 ++----------------------------<wbr>------<br>
 src/util/vircgroupbackend.h |  15 ++++<br>
 src/util/vircgrouppriv.h    |  20 +++++<br>
 src/util/vircgroupv1.c      | 132 ++++++++++++++++++++++++++++++<wbr>+++<br>
 4 files changed, 174 insertions(+), 134 deletions(-)<br>
<br>
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c<br>
index 55122a5ab9..8083e4596d 100644<br>
--- a/src/util/vircgroup.c<br>
+++ b/src/util/vircgroup.c<br>
@@ -80,14 +80,6 @@ VIR_ENUM_IMPL(virCgroupControl<wbr>ler, VIR_CGROUP_CONTROLLER_LAST,<br>
               "freezer", "blkio", "net_cls", "perf_event",<br>
               "name=systemd");<br>
<br>
-typedef enum {<br>
-    VIR_CGROUP_NONE = 0, /* create subdir under each cgroup if possible. */<br>
-    VIR_CGROUP_MEM_HIERACHY = 1 << 0, /* call virCgroupSetMemoryUseHierarchy<br>
-                                       * before creating subcgroups and<br>
-                                       * attaching tasks<br>
-                                       */<br>
-} virCgroupFlags;<br>
-<br>
<br>
 /**<br>
  * virCgroupGetDevicePermsString:<br>
@@ -448,7 +440,7 @@ virCgroupGetBlockDevString(con<wbr>st char *path)<br>
 }<br>
<br>
<br>
-static int<br>
+int<br>
 virCgroupSetValueStr(virCgrou<wbr>pPtr group,<br>
                      int controller,<br>
                      const char *key,<br>
@@ -478,7 +470,7 @@ virCgroupSetValueStr(virCgroup<wbr>Ptr group,<br>
 }<br>
<br>
<br>
-static int<br>
+int<br>
 virCgroupGetValueStr(virCgrou<wbr>pPtr group,<br>
                      int controller,<br>
                      const char *key,<br>
@@ -539,7 +531,7 @@ virCgroupGetValueForBlkDev(vir<wbr>CgroupPtr group,<br>
 }<br>
<br>
<br>
-static int<br>
+int<br>
 virCgroupSetValueU64(virCgrou<wbr>pPtr group,<br>
                      int controller,<br>
                      const char *key,<br>
@@ -591,7 +583,7 @@ virCgroupGetValueI64(virCgroup<wbr>Ptr group,<br>
 }<br>
<br>
<br>
-static int<br>
+int<br>
 virCgroupGetValueU64(virCgrou<wbr>pPtr group,<br>
                      int controller,<br>
                      const char *key,<br>
@@ -613,137 +605,18 @@ virCgroupGetValueU64(virCgroup<wbr>Ptr group,<br>
 }<br>
<br>
<br>
-static int<br>
-virCgroupCpuSetInherit(virCgr<wbr>oupPtr parent, virCgroupPtr group)<br>
-{<br>
-    size_t i;<br>
-    const char *inherit_values[] = {<br>
-        "cpuset.cpus",<br>
-        "cpuset.mems",<br>
-        "cpuset.memory_migrate",<br>
-    };<br>
-<br>
-    VIR_DEBUG("Setting up inheritance %s -> %s", parent->path, group->path);<br>
-    for (i = 0; i < ARRAY_CARDINALITY(inherit_valu<wbr>es); i++) {<br>
-        VIR_AUTOFREE(char *) value = NULL;<br>
-<br>
-        if (virCgroupGetValueStr(parent,<br>
-                                 VIR_CGROUP_CONTROLLER_CPUSET,<br>
-                                 inherit_values[i],<br>
-                                 &value) < 0)<br>
-            return -1;<br>
-<br>
-        VIR_DEBUG("Inherit %s = %s", inherit_values[i], value);<br>
-<br>
-        if (virCgroupSetValueStr(group,<br>
-                                 VIR_CGROUP_CONTROLLER_CPUSET,<br>
-                                 inherit_values[i],<br>
-                                 value) < 0)<br>
-            return -1;<br>
-    }<br>
-<br>
-    return 0;<br>
-}<br>
-<br>
-<br>
-static int<br>
-virCgroupSetMemoryUseHierarch<wbr>y(virCgroupPtr group)<br>
-{<br>
-    unsigned long long value;<br>
-    const char *filename = "memory.use_hierarchy";<br>
-<br>
-    if (virCgroupGetValueU64(group,<br>
-                             VIR_CGROUP_CONTROLLER_MEMORY,<br>
-                             filename, &value) < 0)<br>
-        return -1;<br>
-<br>
-    /* Setting twice causes error, so if already enabled, skip setting */<br>
-    if (value == 1)<br>
-        return 0;<br>
-<br>
-    VIR_DEBUG("Setting up %s/%s", group->path, filename);<br>
-    if (virCgroupSetValueU64(group,<br>
-                             VIR_CGROUP_CONTROLLER_MEMORY,<br>
-                             filename, 1) < 0)<br>
-        return -1;<br>
-<br>
-    return 0;<br>
-}<br>
-<br>
-<br>
 static int<br>
 virCgroupMakeGroup(virCgroupP<wbr>tr parent,<br>
                    virCgroupPtr group,<br>
                    bool create,<br>
                    unsigned int flags)<br>
 {<br>
-    size_t i;<br>
-<br>
-    VIR_DEBUG("Make group %s", group->path);<br>
-    for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {<br>
-        VIR_AUTOFREE(char *) path = NULL;<br>
-<br>
-        /* We must never mkdir() in systemd's hierarchy */<br>
-        if (i == VIR_CGROUP_CONTROLLER_SYSTEMD) {<br>
-            VIR_DEBUG("Not creating systemd controller group");<br>
-            continue;<br>
-        }<br>
-<br>
-        /* Skip over controllers that aren't mounted */<br>
-        if (!group->controllers[i].mountP<wbr>oint) {<br>
-            VIR_DEBUG("Skipping unmounted controller %s",<br>
-                      virCgroupControllerTypeToStrin<wbr>g(i));<br>
-            continue;<br>
-        }<br>
-<br>
-        if (virCgroupPathOfController(gro<wbr>up, i, "", &path) < 0)<br>
-            goto error;<br>
-<br>
-        VIR_DEBUG("Make controller %s", path);<br>
-        if (!virFileExists(path)) {<br>
-            if (!create ||<br>
-                mkdir(path, 0755) < 0) {<br>
-                if (errno == EEXIST)<br>
-                    continue;<br>
-                /* With a kernel that doesn't support multi-level directory<br>
-                 * for blkio controller, libvirt will fail and disable all<br>
-                 * other controllers even though they are available. So<br>
-                 * treat blkio as unmounted if mkdir fails. */<br>
-                if (i == VIR_CGROUP_CONTROLLER_BLKIO) {<br>
-                    VIR_DEBUG("Ignoring mkdir failure with blkio controller. Kernel probably too old");<br>
-                    VIR_FREE(group->controllers[i]<wbr>.mountPoint);<br>
-                    continue;<br>
-                } else {<br>
-                    virReportSystemError(errno,<br>
-                                         _("Failed to create controller %s for group"),<br>
-                                         <wbr>virCgroupControllerTypeToStrin<wbr>g(i));<br>
-                    goto error;<br>
-                }<br>
-            }<br>
-            if (i == VIR_CGROUP_CONTROLLER_CPUSET &&<br>
-                group->controllers[i].mountPoi<wbr>nt != NULL &&<br>
-                virCgroupCpuSetInherit(parent, group) < 0) {<br>
-                goto error;<br>
-            }<br>
-            /*<br>
-             * Note that virCgroupSetMemoryUseHierarchy should always be<br>
-             * called prior to creating subcgroups and attaching tasks.<br>
-             */<br>
-            if ((flags & VIR_CGROUP_MEM_HIERACHY) &&<br>
-                i == VIR_CGROUP_CONTROLLER_MEMORY &&<br>
-                group->controllers[i].mountPoi<wbr>nt != NULL &&<br>
-                virCgroupSetMemoryUseHierarchy<wbr>(group) < 0) {<br>
-                goto error;<br>
-            }<br>
-        }<br>
+    if (group->backend->makeGroup(par<wbr>ent, group, create, flags) < 0) {<br>
+        virCgroupRemove(group);<br>
+        return -1;<br>
     }<br>
<br>
-    VIR_DEBUG("Done making controllers for group");<br>
     return 0;<br>
-<br>
- error:<br>
-    virCgroupRemove(group);<br>
-    return -1;<br>
 }<br>
<br>
<br>
diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h<br>
index cf000529c4..214c9f0726 100644<br>
--- a/src/util/vircgroupbackend.h<br>
+++ b/src/util/vircgroupbackend.h<br>
@@ -27,6 +27,14 @@<br>
<br>
 # define CGROUP_MAX_VAL 512<br>
<br>
+typedef enum {<br>
+    VIR_CGROUP_NONE = 0, /* create subdir under each cgroup if possible. */<br>
+    VIR_CGROUP_MEM_HIERACHY = 1 << 0, /* call virCgroupSetMemoryUseHierarchy<br>
+                                       * before creating subcgroups and<br>
+                                       * attaching tasks<br>
+                                       */<br>
+} virCgroupBackendFlags;<br>
+<br>
 typedef enum {<br>
     VIR_CGROUP_BACKEND_TYPE_V1 = 0,<br>
     VIR_CGROUP_BACKEND_TYPE_LAST,<br>
@@ -86,6 +94,12 @@ typedef int<br>
                                const char *key,<br>
                                char **path);<br>
<br>
+typedef int<br>
+(*virCgroupMakeGroupCB)(virCg<wbr>roupPtr parent,<br>
+                        virCgroupPtr group,<br>
+                        bool create,<br>
+                        unsigned int flags);<br>
+<br>
 struct _virCgroupBackend {<br>
     virCgroupBackendType type;<br>
<br>
@@ -102,6 +116,7 @@ struct _virCgroupBackend {<br>
     virCgroupHasControllerCB hasController;<br>
     virCgroupGetAnyControllerCB getAnyController;<br>
     virCgroupPathOfControllerCB pathOfController;<br>
+    virCgroupMakeGroupCB makeGroup;<br>
 };<br>
 typedef struct _virCgroupBackend virCgroupBackend;<br>
 typedef virCgroupBackend *virCgroupBackendPtr;<br>
diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h<br>
index e7f4a1f0fc..2e731458d5 100644<br>
--- a/src/util/vircgrouppriv.h<br>
+++ b/src/util/vircgrouppriv.h<br>
@@ -53,6 +53,26 @@ struct _virCgroup {<br>
     virCgroupController controllers[VIR_CGROUP_CONTROL<wbr>LER_LAST];<br>
 };<br>
<br>
+int virCgroupSetValueStr(virCgroup<wbr>Ptr group,<br>
+                         int controller,<br>
+                         const char *key,<br>
+                         const char *value);<br>
+<br>
+int virCgroupGetValueStr(virCgroup<wbr>Ptr group,<br>
+                         int controller,<br>
+                         const char *key,<br>
+                         char **value);<br>
+<br>
+int virCgroupSetValueU64(virCgroup<wbr>Ptr group,<br>
+                         int controller,<br>
+                         const char *key,<br>
+                         unsigned long long int value);<br>
+<br>
+int virCgroupGetValueU64(virCgroup<wbr>Ptr group,<br>
+                         int controller,<br>
+                         const char *key,<br>
+                         unsigned long long int *value);<br>
+<br>
 int virCgroupPartitionEscape(char **path);<br>
<br>
 int virCgroupNewPartition(const char *path,<br>
diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c<br>
index 7d92150dc3..cf484216cc 100644<br>
--- a/src/util/vircgroupv1.c<br>
+++ b/src/util/vircgroupv1.c<br>
@@ -536,6 +536,137 @@ virCgroupV1PathOfController(vi<wbr>rCgroupPtr group,<br>
 }<br>
<br>
<br>
+static int<br>
+virCgroupV1CpuSetInherit(virC<wbr>groupPtr parent,<br>
+                         virCgroupPtr group)<br>
+{<br>
+    size_t i;<br>
+    const char *inherit_values[] = {<br>
+        "cpuset.cpus",<br>
+        "cpuset.mems",<br>
+        "cpuset.memory_migrate",<br>
+    };<br>
+<br>
+    VIR_DEBUG("Setting up inheritance %s -> %s", parent->path, group->path);<br>
+    for (i = 0; i < ARRAY_CARDINALITY(inherit_valu<wbr>es); i++) {<br>
+        VIR_AUTOFREE(char *) value = NULL;<br>
+<br>
+        if (virCgroupGetValueStr(parent,<br>
+                                 VIR_CGROUP_CONTROLLER_CPUSET,<br>
+                                 inherit_values[i],<br>
+                                 &value) < 0)<br>
+            return -1;<br>
+<br>
+        VIR_DEBUG("Inherit %s = %s", inherit_values[i], value);<br>
+<br>
+        if (virCgroupSetValueStr(group,<br>
+                                 VIR_CGROUP_CONTROLLER_CPUSET,<br>
+                                 inherit_values[i],<br>
+                                 value) < 0)<br>
+            return -1;<br>
+    }<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+<br>
+static int<br>
+virCgroupV1SetMemoryUseHierar<wbr>chy(virCgroupPtr group)<br>
+{<br>
+    unsigned long long value;<br>
+    const char *filename = "memory.use_hierarchy";<br>
+<br>
+    if (virCgroupGetValueU64(group,<br>
+                             VIR_CGROUP_CONTROLLER_MEMORY,<br>
+                             filename, &value) < 0)<br>
+        return -1;<br>
+<br>
+    /* Setting twice causes error, so if already enabled, skip setting */<br>
+    if (value == 1)<br>
+        return 0;<br>
+<br>
+    VIR_DEBUG("Setting up %s/%s", group->path, filename);<br>
+    if (virCgroupSetValueU64(group,<br>
+                             VIR_CGROUP_CONTROLLER_MEMORY,<br>
+                             filename, 1) < 0)<br>
+        return -1;<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+<br>
+static int<br>
+virCgroupV1MakeGroup(virCgrou<wbr>pPtr parent,<br>
+                     virCgroupPtr group,<br>
+                     bool create,<br>
+                     unsigned int flags)<br>
+{<br>
+    size_t i;<br>
+<br>
+    VIR_DEBUG("Make group %s", group->path);<br>
+    for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {<br>
+        VIR_AUTOFREE(char *) path = NULL;<br>
+<br>
+        /* We must never mkdir() in systemd's hierarchy */<br>
+        if (i == VIR_CGROUP_CONTROLLER_SYSTEMD) {<br>
+            VIR_DEBUG("Not creating systemd controller group");<br>
+            continue;<br>
+        }<br>
+<br>
+        /* Skip over controllers that aren't mounted */<br>
+        if (!group->controllers[i].mountP<wbr>oint) {<br>
+            VIR_DEBUG("Skipping unmounted controller %s",<br>
+                      virCgroupV1ControllerTypeToStr<wbr>ing(i));<br>
+            continue;<br>
+        }<br>
+<br>
+        if (virCgroupV1PathOfController(g<wbr>roup, i, "", &path) < 0)<br>
+            return -1;<br>
+<br>
+        VIR_DEBUG("Make controller %s", path);<br>
+        if (!virFileExists(path)) {<br>
+            if (!create ||<br>
+                mkdir(path, 0755) < 0) {<br>
+                if (errno == EEXIST)<br>
+                    continue;<br>
+                /* With a kernel that doesn't support multi-level directory<br>
+                 * for blkio controller, libvirt will fail and disable all<br>
+                 * other controllers even though they are available. So<br>
+                 * treat blkio as unmounted if mkdir fails. */<br>
+                if (i == VIR_CGROUP_CONTROLLER_BLKIO) {<br>
+                    VIR_DEBUG("Ignoring mkdir failure with blkio controller. Kernel probably too old");<br>
+                    VIR_FREE(group->controllers[i]<wbr>.mountPoint);<br>
+                    continue;<br>
+                } else {<br>
+                    virReportSystemError(errno,<br>
+                                         _("Failed to create v1 controller %s for group"),<br>
+                                         <wbr>virCgroupV1ControllerTypeToStr<wbr>ing(i));<br>
+                    return -1;<br>
+                }<br>
+            }<br>
+            if (i == VIR_CGROUP_CONTROLLER_CPUSET &&<br>
+                group->controllers[i].mountPoi<wbr>nt != NULL &&<br>
+                virCgroupV1CpuSetInherit(paren<wbr>t, group) < 0) {<br>
+                return -1;<br>
+            }<br>
+            /*<br>
+             * Note that virCgroupV1SetMemoryUseHierarc<wbr>hy should always be<br>
+             * called prior to creating subcgroups and attaching tasks.<br>
+             */<br>
+            if ((flags & VIR_CGROUP_MEM_HIERACHY) &&<br>
+                i == VIR_CGROUP_CONTROLLER_MEMORY &&<br>
+                group->controllers[i].mountPoi<wbr>nt != NULL &&<br>
+                virCgroupV1SetMemoryUseHierarc<wbr>hy(group) < 0) {<br>
+                return -1;<br>
+            }<br>
+        }<br>
+    }<br>
+<br>
+    VIR_DEBUG("Done making controllers for group");<br>
+    return 0;<br>
+}<br>
+<br>
+<br>
 virCgroupBackend virCgroupV1Backend = {<br>
     .type = VIR_CGROUP_BACKEND_TYPE_V1,<br>
<br>
@@ -551,6 +682,7 @@ virCgroupBackend virCgroupV1Backend = {<br>
     .hasController = virCgroupV1HasController,<br>
     .getAnyController = virCgroupV1GetAnyController,<br>
     .pathOfController = virCgroupV1PathOfController,<br>
+    .makeGroup = virCgroupV1MakeGroup,<br>
 };<br>
<span class="m_-162758043428344124HOEnZb"><font color="#888888"> <br>
<br>
-- <br>
2.17.1<br>
<br>
--<br>
libvir-list mailing list<br>
<a href="mailto:libvir-list@redhat.com" target="_blank">libvir-list@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/libvir-list" rel="noreferrer" target="_blank">https://www.redhat.com/mailman<wbr>/listinfo/libvir-list</a><br>
</font></span></blockquote></div><br></div></div>