[libvirt] [PATCH 37/53] vircgroup: introduce virCgroupV2SetCpuCfsPeriod

Pavel Hrdina posted 53 patches 6 years, 7 months ago
There is a newer version of this series
[libvirt] [PATCH 37/53] vircgroup: introduce virCgroupV2SetCpuCfsPeriod
Posted by Pavel Hrdina 6 years, 7 months ago
In order to set CPU cfs period using cgroup v2 'cpu.max' interface
we need to load the current value of CPU cfs quota first because
format of 'cpu.max' interface is '$quota $period' and in order to
change 'period' we need to write 'quota' as well.  Writing only one
number changes only 'quota'.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
 src/util/vircgroupv2.c | 68 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 6cecfb9741..92fe825795 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -1327,6 +1327,72 @@ virCgroupV2GetCpuShares(virCgroupPtr group,
 }
 
 
+static int
+virCgroupV2SetCpuCfsPeriod(virCgroupPtr group,
+                           unsigned long long cfs_period)
+{
+    VIR_AUTOFREE(char *) value = NULL;
+    VIR_AUTOFREE(char *) str = NULL;
+    char *tmp;
+
+    /* The cfs_period should be greater or equal than 1ms, and less or equal
+     * than 1s.
+     */
+    if (cfs_period < 1000 || cfs_period > 1000000) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("cfs_period '%llu' must be in range (1000, 1000000)"),
+                       cfs_period);
+        return -1;
+    }
+
+    if (virCgroupGetValueStr(group, VIR_CGROUP_CONTROLLER_CPU,
+                             "cpu.max", &str) < 0) {
+        return -1;
+    }
+
+    if (!(tmp = strchr(str, ' '))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Invalid 'cpu.max' data."));
+        return -1;
+    }
+    *tmp = '\n';
+
+    if (virAsprintf(&value, "%s %llu", str, cfs_period) < 0)
+        return -1;
+
+    return virCgroupSetValueStr(group, VIR_CGROUP_CONTROLLER_CPU,
+                                "cpu.max", value);
+}
+
+
+static int
+virCgroupV2GetCpuCfsPeriod(virCgroupPtr group,
+                           unsigned long long *cfs_period)
+{
+    VIR_AUTOFREE(char *) str = NULL;
+    char *tmp;
+
+    if (virCgroupGetValueStr(group, VIR_CGROUP_CONTROLLER_CPU,
+                             "cpu.max", &str) < 0) {
+        return -1;
+    }
+
+    if (!(tmp = strchr(str, ' '))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Invalid 'cpu.max' data."));
+        return -1;
+    }
+
+    if (virStrToLong_ull(tmp, NULL, 10, cfs_period) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to parse value '%s' from cpu.max."), str);
+        return -1;
+    }
+
+    return 0;
+}
+
+
 virCgroupBackend virCgroupV2Backend = {
     .type = VIR_CGROUP_BACKEND_TYPE_V2,
 
@@ -1377,6 +1443,8 @@ virCgroupBackend virCgroupV2Backend = {
 
     .setCpuShares = virCgroupV2SetCpuShares,
     .getCpuShares = virCgroupV2GetCpuShares,
+    .setCpuCfsPeriod = virCgroupV2SetCpuCfsPeriod,
+    .getCpuCfsPeriod = virCgroupV2GetCpuCfsPeriod,
 };
 
 
-- 
2.17.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 37/53] vircgroup: introduce virCgroupV2SetCpuCfsPeriod
Posted by Michal Privoznik 6 years, 7 months ago
On 10/02/2018 10:44 AM, Pavel Hrdina wrote:
> In order to set CPU cfs period using cgroup v2 'cpu.max' interface
> we need to load the current value of CPU cfs quota first because
> format of 'cpu.max' interface is '$quota $period' and in order to
> change 'period' we need to write 'quota' as well.  Writing only one
> number changes only 'quota'.
> 
> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
> ---
>  src/util/vircgroupv2.c | 68 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 68 insertions(+)

ACK

Michal

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