[PATCH 4/4] util: vircgroupv2: add support for BFQ files

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

 



In kernel 4.12 there was introduced new BFQ scheduler and in kernel
5.0 the old CFQ scheduler was removed.  This has an implication on
the cgroups file names.

If the CFQ controller is enabled we use one file:

    io.weight

The new BFQ controller expose one file with different name:

    io.bfq.weight

Except for different name they have different syntax.

io.weight:

    default $val
    major:minor $val

io.bfq.weight:

    $val

The difference is that BFQ doesn't support per-device weight.

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

diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index de3a9dae8a..1179c4459a 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -554,15 +554,35 @@ static int
 virCgroupV2SetBlkioWeight(virCgroupPtr group,
                           unsigned int weight)
 {
+    VIR_AUTOFREE(char *) path = NULL;
     VIR_AUTOFREE(char *) value = NULL;
+    const char *format = "%u";
 
-    if (virAsprintf(&value, "default %u", weight) < 0)
+    if (virCgroupV2PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO,
+                                    "io.bfq.weight", &path) < 0) {
         return -1;
+    }
 
-    return virCgroupSetValueStr(group,
-                                VIR_CGROUP_CONTROLLER_BLKIO,
-                                "io.weight",
-                                value);
+    if (!virFileExists(path)) {
+        VIR_FREE(path);
+        format = "default %u";
+
+        if (virCgroupV2PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO,
+                                        "io.weight", &path) < 0) {
+            return -1;
+        }
+    }
+
+    if (!virFileExists(path)) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("blkio weight is valid only for bfq or cfq scheduler"));
+        return -1;
+    }
+
+    if (virAsprintf(&value, format, weight) < 0)
+        return -1;
+
+    return virCgroupSetValueRaw(path, value);
 }
 
 
@@ -570,20 +590,38 @@ static int
 virCgroupV2GetBlkioWeight(virCgroupPtr group,
                           unsigned int *weight)
 {
+    VIR_AUTOFREE(char *) path = NULL;
     VIR_AUTOFREE(char *) value = NULL;
     char *tmp;
 
-    if (virCgroupGetValueStr(group, VIR_CGROUP_CONTROLLER_BLKIO,
-                             "io.weight", &value) < 0) {
+    if (virCgroupV2PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO,
+                                    "io.bfq.weight", &path) < 0) {
         return -1;
     }
 
-    if (!(tmp = strstr(value, "default "))) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Cannot find default io weight."));
+    if (!virFileExists(path)) {
+        VIR_FREE(path);
+
+        if (virCgroupV2PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO,
+                                        "io.weight", &path) < 0) {
+            return -1;
+        }
+    }
+
+    if (!virFileExists(path)) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("blkio weight is valid only for bfq or cfq scheduler"));
         return -1;
     }
-    tmp += strlen("default ");
+
+    if (virCgroupGetValueRaw(path, &value) < 0)
+        return -1;
+
+    if ((tmp = strstr(value, "default "))) {
+        tmp += strlen("default ");
+    } else {
+        tmp = value;
+    }
 
     if (virStrToLong_ui(tmp, NULL, 10, weight) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -725,41 +763,58 @@ virCgroupV2GetBlkioIoDeviceServiced(virCgroupPtr group,
 
 static int
 virCgroupV2SetBlkioDeviceWeight(virCgroupPtr group,
-                                const char *path,
+                                const char *devPath,
                                 unsigned int weight)
 {
+    VIR_AUTOFREE(char *) path = NULL;
     VIR_AUTOFREE(char *) str = NULL;
     VIR_AUTOFREE(char *) blkstr = NULL;
 
-    if (!(blkstr = virCgroupGetBlockDevString(path)))
+    if (!(blkstr = virCgroupGetBlockDevString(devPath)))
         return -1;
 
     if (virAsprintf(&str, "%s%d", blkstr, weight) < 0)
         return -1;
 
-    return virCgroupSetValueStr(group,
-                                VIR_CGROUP_CONTROLLER_BLKIO,
-                                "io.weight",
-                                str);
+    if (virCgroupV2PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO,
+                                    "io.weight", &path) < 0) {
+        return -1;
+    }
+
+    if (!virFileExists(path)) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("blkio device weight is valid only for cfq scheduler"));
+        return -1;
+    }
+
+    return virCgroupSetValueRaw(path, str);
 }
 
 
 static int
 virCgroupV2GetBlkioDeviceWeight(virCgroupPtr group,
-                                const char *path,
+                                const char *devPath,
                                 unsigned int *weight)
 {
+    VIR_AUTOFREE(char *) path = NULL;
     VIR_AUTOFREE(char *) str = NULL;
     VIR_AUTOFREE(char *) value = NULL;
 
-    if (virCgroupGetValueStr(group,
-                             VIR_CGROUP_CONTROLLER_BLKIO,
-                             "io.weight",
-                             &value) < 0) {
+    if (virCgroupV2PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO,
+                                    "io.weight", &path) < 0) {
         return -1;
     }
 
-    if (virCgroupGetValueForBlkDev(value, path, &str) < 0)
+    if (!virFileExists(path)) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("blkio device weight is valid only for cfq scheduler"));
+        return -1;
+    }
+
+    if (virCgroupGetValueRaw(path, &value) < 0)
+        return -1;
+
+    if (virCgroupGetValueForBlkDev(value, devPath, &str) < 0)
         return -1;
 
     if (!str) {
-- 
2.21.0

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[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