[libvirt] [PATCH 0/4] cgroups: add support for BFQ scheduler

Pavel Hrdina (4): util: vircgroup: introduce virCgroup(Get|Set)ValueRaw util: vircgroup: move virCgroupGetValueStr out of virCgroupGetValueForBlkDev util: vircgroupv1: add support for BFQ blkio files util: vircgroupv2: add support for BFQ files src/util/vircgroup.c | 70 +++++++++------- src/util/vircgrouppriv.h | 12 ++- src/util/vircgroupv1.c | 174 +++++++++++++++++++++++++++++---------- src/util/vircgroupv2.c | 156 +++++++++++++++++++++++++---------- 4 files changed, 292 insertions(+), 120 deletions(-) -- 2.21.0

If we need to get a path of specific file and we need to check its existence before we use it then we can reuse that path to get/set values instead of calling the existing get/set value functions which would be building the path again. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroup.c | 62 ++++++++++++++++++++++++++-------------- src/util/vircgrouppriv.h | 6 ++++ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index f58e336404..278453ea2f 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -455,28 +455,22 @@ virCgroupGetBlockDevString(const char *path) int -virCgroupSetValueStr(virCgroupPtr group, - int controller, - const char *key, +virCgroupSetValueRaw(const char *path, const char *value) { - VIR_AUTOFREE(char *) keypath = NULL; - char *tmp = NULL; + char *tmp; - if (virCgroupPathOfController(group, controller, key, &keypath) < 0) - return -1; - - VIR_DEBUG("Set value '%s' to '%s'", keypath, value); - if (virFileWriteStr(keypath, value, 0) < 0) { + VIR_DEBUG("Set value '%s' to '%s'", path, value); + if (virFileWriteStr(path, value, 0) < 0) { if (errno == EINVAL && - (tmp = strrchr(keypath, '/'))) { + (tmp = strrchr(path, '/'))) { virReportSystemError(errno, _("Invalid value '%s' for '%s'"), value, tmp + 1); return -1; } virReportSystemError(errno, - _("Unable to write to '%s'"), keypath); + _("Unable to write to '%s'"), path); return -1; } @@ -485,24 +479,18 @@ virCgroupSetValueStr(virCgroupPtr group, int -virCgroupGetValueStr(virCgroupPtr group, - int controller, - const char *key, +virCgroupGetValueRaw(const char *path, char **value) { - VIR_AUTOFREE(char *) keypath = NULL; int rc; *value = NULL; - if (virCgroupPathOfController(group, controller, key, &keypath) < 0) - return -1; + VIR_DEBUG("Get value %s", path); - VIR_DEBUG("Get value %s", keypath); - - if ((rc = virFileReadAll(keypath, 1024*1024, value)) < 0) { + if ((rc = virFileReadAll(path, 1024*1024, value)) < 0) { virReportSystemError(errno, - _("Unable to read from '%s'"), keypath); + _("Unable to read from '%s'"), path); return -1; } @@ -514,6 +502,36 @@ virCgroupGetValueStr(virCgroupPtr group, } +int +virCgroupSetValueStr(virCgroupPtr group, + int controller, + const char *key, + const char *value) +{ + VIR_AUTOFREE(char *) keypath = NULL; + + if (virCgroupPathOfController(group, controller, key, &keypath) < 0) + return -1; + + return virCgroupSetValueRaw(keypath, value); +} + + +int +virCgroupGetValueStr(virCgroupPtr group, + int controller, + const char *key, + char **value) +{ + VIR_AUTOFREE(char *) keypath = NULL; + + if (virCgroupPathOfController(group, controller, key, &keypath) < 0) + return -1; + + return virCgroupGetValueRaw(keypath, value); +} + + int virCgroupGetValueForBlkDev(virCgroupPtr group, int controller, diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h index 9110c77297..758091811e 100644 --- a/src/util/vircgrouppriv.h +++ b/src/util/vircgrouppriv.h @@ -58,6 +58,12 @@ struct _virCgroup { virCgroupV2Controller unified; }; +int virCgroupSetValueRaw(const char *path, + const char *value); + +int virCgroupGetValueRaw(const char *path, + char **value); + int virCgroupSetValueStr(virCgroupPtr group, int controller, const char *key, -- 2.21.0

If we need to get a path of specific file and we need to check its existence before we use it then we can reuse that path to get value for specific device. This way we will not build the path again in virCgroupGetValueForBlkDev. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroup.c | 8 +---- src/util/vircgrouppriv.h | 6 ++-- src/util/vircgroupv1.c | 70 ++++++++++++++++++++++++++-------------- src/util/vircgroupv2.c | 65 +++++++++++++++++++++++-------------- 4 files changed, 88 insertions(+), 61 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 278453ea2f..e32215935b 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -533,20 +533,14 @@ virCgroupGetValueStr(virCgroupPtr group, int -virCgroupGetValueForBlkDev(virCgroupPtr group, - int controller, - const char *key, +virCgroupGetValueForBlkDev(const char *str, const char *path, char **value) { VIR_AUTOFREE(char *) prefix = NULL; - VIR_AUTOFREE(char *) str = NULL; char **lines = NULL; int ret = -1; - if (virCgroupGetValueStr(group, controller, key, &str) < 0) - goto error; - if (!(prefix = virCgroupGetBlockDevString(path))) goto error; diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h index 758091811e..334095719e 100644 --- a/src/util/vircgrouppriv.h +++ b/src/util/vircgrouppriv.h @@ -98,10 +98,8 @@ int virCgroupPartitionEscape(char **path); char *virCgroupGetBlockDevString(const char *path); -int virCgroupGetValueForBlkDev(virCgroupPtr group, - int controller, - const char *key, - const char *path, +int virCgroupGetValueForBlkDev(const char *str, + const char *devPath, char **value); int virCgroupNew(pid_t pid, diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c index 8ce10d3608..064b99dceb 100644 --- a/src/util/vircgroupv1.c +++ b/src/util/vircgroupv1.c @@ -1181,12 +1181,16 @@ virCgroupV1GetBlkioDeviceWeight(virCgroupPtr group, unsigned int *weight) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.weight_device", - path, - &str) < 0) + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.weight_device", + &value) < 0) { + return -1; + } + + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) return -1; if (!str) { @@ -1229,12 +1233,16 @@ virCgroupV1GetBlkioDeviceReadIops(virCgroupPtr group, unsigned int *riops) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.throttle.read_iops_device", - path, - &str) < 0) + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.throttle.read_iops_device", + &value) < 0) { + return -1; + } + + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) return -1; if (!str) { @@ -1277,12 +1285,16 @@ virCgroupV1GetBlkioDeviceWriteIops(virCgroupPtr group, unsigned int *wiops) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.throttle.write_iops_device", - path, - &str) < 0) + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.throttle.write_iops_device", + &value) < 0) { + return -1; + } + + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) return -1; if (!str) { @@ -1325,12 +1337,16 @@ virCgroupV1GetBlkioDeviceReadBps(virCgroupPtr group, unsigned long long *rbps) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.throttle.read_bps_device", - path, - &str) < 0) + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.throttle.read_bps_device", + &value) < 0) { + return -1; + } + + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) return -1; if (!str) { @@ -1373,12 +1389,16 @@ virCgroupV1GetBlkioDeviceWriteBps(virCgroupPtr group, unsigned long long *wbps) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.throttle.write_bps_device", - path, - &str) < 0) + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.throttle.write_bps_device", + &value) < 0) { + return -1; + } + + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) return -1; if (!str) { diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index 0cfbc96264..de3a9dae8a 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -750,15 +750,18 @@ virCgroupV2GetBlkioDeviceWeight(virCgroupPtr group, unsigned int *weight) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "io.weight", - path, - &str) < 0) { + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "io.weight", + &value) < 0) { return -1; } + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) + return -1; + if (!str) { *weight = 0; } else if (virStrToLong_ui(str, NULL, 10, weight) < 0) { @@ -804,17 +807,20 @@ virCgroupV2GetBlkioDeviceReadIops(virCgroupPtr group, unsigned int *riops) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; const char *name = "riops="; char *tmp; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "io.max", - path, - &str) < 0) { + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "io.max", + &value) < 0) { return -1; } + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) + return -1; + if (!str) { *riops = 0; } else { @@ -872,17 +878,20 @@ virCgroupV2GetBlkioDeviceWriteIops(virCgroupPtr group, unsigned int *wiops) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; const char *name = "wiops="; char *tmp; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "io.max", - path, - &str) < 0) { + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "io.max", + &value) < 0) { return -1; } + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) + return -1; + if (!str) { *wiops = 0; } else { @@ -940,17 +949,20 @@ virCgroupV2GetBlkioDeviceReadBps(virCgroupPtr group, unsigned long long *rbps) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; const char *name = "rbps="; char *tmp; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "io.max", - path, - &str) < 0) { + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "io.max", + &value) < 0) { return -1; } + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) + return -1; + if (!str) { *rbps = 0; } else { @@ -1008,17 +1020,20 @@ virCgroupV2GetBlkioDeviceWriteBps(virCgroupPtr group, unsigned long long *wbps) { VIR_AUTOFREE(char *) str = NULL; + VIR_AUTOFREE(char *) value = NULL; const char *name = "wbps="; char *tmp; - if (virCgroupGetValueForBlkDev(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "io.max", - path, - &str) < 0) { + if (virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_BLKIO, + "io.max", + &value) < 0) { return -1; } + if (virCgroupGetValueForBlkDev(value, path, &str) < 0) + return -1; + if (!str) { *wbps = 0; } else { -- 2.21.0

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 these two files: blkio.weight blkio.weight_device The new BFQ controller expose only one file with different name: blkio.bfq.weight The reason is that BFQ controller doesn't support per-device weight. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroupv1.c | 114 ++++++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 24 deletions(-) diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c index 064b99dceb..97258917bc 100644 --- a/src/util/vircgroupv1.c +++ b/src/util/vircgroupv1.c @@ -949,10 +949,33 @@ static int virCgroupV1SetBlkioWeight(virCgroupPtr group, unsigned int weight) { - return virCgroupSetValueU64(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.weight", - weight); + VIR_AUTOFREE(char *) path = NULL; + VIR_AUTOFREE(char *) value = NULL; + + if (virCgroupV1PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.bfq.weight", &path) < 0) { + return -1; + } + + if (!virFileExists(path)) { + VIR_FREE(path); + + if (virCgroupV1PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.weight", &path) < 0) { + return -1; + } + } + + if (!virFileExists(path)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("blkio device weight is valid only for bfq or cfq scheduler")); + return -1; + } + + if (virAsprintf(&value, "%u", weight) < 0) + return -1; + + return virCgroupSetValueRaw(path, value); } @@ -960,14 +983,40 @@ static int virCgroupV1GetBlkioWeight(virCgroupPtr group, unsigned int *weight) { - unsigned long long tmp; - int ret; - ret = virCgroupGetValueU64(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.weight", &tmp); - if (ret == 0) - *weight = tmp; - return ret; + VIR_AUTOFREE(char *) path = NULL; + VIR_AUTOFREE(char *) value = NULL; + + if (virCgroupV1PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.bfq.weight", &path) < 0) { + return -1; + } + + if (!virFileExists(path)) { + VIR_FREE(path); + + if (virCgroupV1PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.weight", &path) < 0) { + return -1; + } + } + + if (!virFileExists(path)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("blkio device weight is valid only for bfq or cfq scheduler")); + return -1; + } + + if (virCgroupGetValueRaw(path, &value) < 0) + return -1; + + if (virStrToLong_ui(value, NULL, 10, weight) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unable to parse '%s' as an integer"), + value); + return -1; + } + + return 0; } @@ -1156,41 +1205,58 @@ virCgroupV1GetBlkioIoDeviceServiced(virCgroupPtr group, static int virCgroupV1SetBlkioDeviceWeight(virCgroupPtr group, - const char *path, + const char *devPath, unsigned int weight) { VIR_AUTOFREE(char *) str = NULL; VIR_AUTOFREE(char *) blkstr = NULL; + VIR_AUTOFREE(char *) path = 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, - "blkio.weight_device", - str); + if (virCgroupV1PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.weight_device", &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 virCgroupV1GetBlkioDeviceWeight(virCgroupPtr group, - const char *path, + const char *devPath, unsigned int *weight) { VIR_AUTOFREE(char *) str = NULL; VIR_AUTOFREE(char *) value = NULL; + VIR_AUTOFREE(char *) path = NULL; - if (virCgroupGetValueStr(group, - VIR_CGROUP_CONTROLLER_BLKIO, - "blkio.weight_device", - &value) < 0) { + if (virCgroupV1PathOfController(group, VIR_CGROUP_CONTROLLER_BLKIO, + "blkio.weight_device", &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

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@redhat.com> --- 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

On Wed, Jun 19, 2019 at 04:16:46PM +0200, Pavel Hrdina wrote:
Pavel Hrdina (4): util: vircgroup: introduce virCgroup(Get|Set)ValueRaw util: vircgroup: move virCgroupGetValueStr out of virCgroupGetValueForBlkDev util: vircgroupv1: add support for BFQ blkio files util: vircgroupv2: add support for BFQ files
src/util/vircgroup.c | 70 +++++++++------- src/util/vircgrouppriv.h | 12 ++- src/util/vircgroupv1.c | 174 +++++++++++++++++++++++++++++---------- src/util/vircgroupv2.c | 156 +++++++++++++++++++++++++---------- 4 files changed, 292 insertions(+), 120 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Pavel Hrdina