[libvirt] [PATCH 0/4] implement cgroups v2 cpuset controller support

Pavel Hrdina (4): util: implement virCgroupV2(Set|Get)CpusetMems util: implement virCgroupV2(Set|Get)CpusetMemoryMigrate util: implement virCgroupV2(Set|Get)CpusetCpus util: enable cgroups v2 cpuset controller for threads src/util/vircgroupv2.c | 74 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) -- 2.20.1

Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroupv2.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index e0fa8e1cc0..4cfbd52f2d 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -1561,6 +1561,28 @@ virCgroupV2GetCpuacctStat(virCgroupPtr group, } +static int +virCgroupV2SetCpusetMems(virCgroupPtr group, + const char *mems) +{ + return virCgroupSetValueStr(group, + VIR_CGROUP_CONTROLLER_CPUSET, + "cpuset.mems", + mems); +} + + +static int +virCgroupV2GetCpusetMems(virCgroupPtr group, + char **mems) +{ + return virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_CPUSET, + "cpuset.mems", + mems); +} + + virCgroupBackend virCgroupV2Backend = { .type = VIR_CGROUP_BACKEND_TYPE_V2, @@ -1620,6 +1642,9 @@ virCgroupBackend virCgroupV2Backend = { .getCpuacctUsage = virCgroupV2GetCpuacctUsage, .getCpuacctStat = virCgroupV2GetCpuacctStat, + + .setCpusetMems = virCgroupV2SetCpusetMems, + .getCpusetMems = virCgroupV2GetCpusetMems, }; -- 2.20.1

Cgroups v2 don't have memory_migrate interface and the migration is enabled by default. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroupv2.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index 4cfbd52f2d..f3aa6ebc48 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -1583,6 +1583,23 @@ virCgroupV2GetCpusetMems(virCgroupPtr group, } +static int +virCgroupV2SetCpusetMemoryMigrate(virCgroupPtr group ATTRIBUTE_UNUSED, + bool migrate ATTRIBUTE_UNUSED) +{ + return 0; +} + + +static int +virCgroupV2GetCpusetMemoryMigrate(virCgroupPtr group ATTRIBUTE_UNUSED, + bool *migrate) +{ + *migrate = true; + return 0; +} + + virCgroupBackend virCgroupV2Backend = { .type = VIR_CGROUP_BACKEND_TYPE_V2, @@ -1645,6 +1662,8 @@ virCgroupBackend virCgroupV2Backend = { .setCpusetMems = virCgroupV2SetCpusetMems, .getCpusetMems = virCgroupV2GetCpusetMems, + .setCpusetMemoryMigrate = virCgroupV2SetCpusetMemoryMigrate, + .getCpusetMemoryMigrate = virCgroupV2GetCpusetMemoryMigrate, }; -- 2.20.1

Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroupv2.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index f3aa6ebc48..25afab1cad 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -1600,6 +1600,28 @@ virCgroupV2GetCpusetMemoryMigrate(virCgroupPtr group ATTRIBUTE_UNUSED, } +static int +virCgroupV2SetCpusetCpus(virCgroupPtr group, + const char *cpus) +{ + return virCgroupSetValueStr(group, + VIR_CGROUP_CONTROLLER_CPUSET, + "cpuset.cpus", + cpus); +} + + +static int +virCgroupV2GetCpusetCpus(virCgroupPtr group, + char **cpus) +{ + return virCgroupGetValueStr(group, + VIR_CGROUP_CONTROLLER_CPUSET, + "cpuset.cpus", + cpus); +} + + virCgroupBackend virCgroupV2Backend = { .type = VIR_CGROUP_BACKEND_TYPE_V2, @@ -1664,6 +1686,8 @@ virCgroupBackend virCgroupV2Backend = { .getCpusetMems = virCgroupV2GetCpusetMems, .setCpusetMemoryMigrate = virCgroupV2SetCpusetMemoryMigrate, .getCpusetMemoryMigrate = virCgroupV2GetCpusetMemoryMigrate, + .setCpusetCpus = virCgroupV2SetCpusetCpus, + .getCpusetCpus = virCgroupV2GetCpusetCpus, }; -- 2.20.1

When we create cgroup for qemu threads we need to enable cpuset controller in order to use it. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util/vircgroupv2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index 25afab1cad..4084929c5a 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -400,6 +400,12 @@ virCgroupV2MakeGroup(virCgroupPtr parent ATTRIBUTE_UNUSED, VIR_CGROUP_CONTROLLER_CPU) < 0) { return -1; } + + if (virCgroupV2HasController(parent, VIR_CGROUP_CONTROLLER_CPUSET) && + virCgroupV2EnableController(parent, + VIR_CGROUP_CONTROLLER_CPUSET) < 0) { + return -1; + } } else { size_t i; for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) { -- 2.20.1

On 2/20/19 3:55 PM, Pavel Hrdina wrote:
Pavel Hrdina (4): util: implement virCgroupV2(Set|Get)CpusetMems util: implement virCgroupV2(Set|Get)CpusetMemoryMigrate util: implement virCgroupV2(Set|Get)CpusetCpus util: enable cgroups v2 cpuset controller for threads
src/util/vircgroupv2.c | 74 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+)
ACK Michal
participants (2)
-
Michal Privoznik
-
Pavel Hrdina