With cgroupv2 this has better effect on the resource allocation. An
excerpt from Documentation/admin-guide/cgroup-v2.rst explains is this
way:
Migrating a process across cgroups is a relatively expensive operation
and stateful resources such as memory are not moved together with the
process. This is an explicit design decision as there often exist
inherent trade-offs between migration and various hot paths in terms
of synchronization cost.
[...]
Setting a non-empty value to "cpuset.mems" causes memory of
tasks within the cgroup to be migrated to the designated nodes if
they are currently using memory outside of the designated nodes.
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/ch/ch_process.c | 12 ++++++------
src/qemu/qemu_process.c | 10 +++++-----
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c
index c145a7849647..44c5b0611ef5 100644
--- a/src/ch/ch_process.c
+++ b/src/ch/ch_process.c
@@ -262,6 +262,12 @@ virCHProcessSetupPid(virDomainObj *vm,
if (virCgroupNewThread(priv->cgroup, nameval, id, true, &cgroup) < 0)
goto cleanup;
+ /* Move the thread to the sub dir before changing the settings so that
+ * all take effect even with cgroupv2. */
+ VIR_INFO("Adding pid %d to cgroup", pid);
+ if (virCgroupAddThread(cgroup, pid) < 0)
+ goto cleanup;
+
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
if (use_cpumask &&
virDomainCgroupSetupCpusetCpus(cgroup, use_cpumask) < 0)
@@ -274,12 +280,6 @@ virCHProcessSetupPid(virDomainObj *vm,
if (virDomainCgroupSetupVcpuBW(cgroup, period, quota) < 0)
goto cleanup;
-
- /* Move the thread to the sub dir */
- VIR_INFO("Adding pid %d to cgroup", pid);
- if (virCgroupAddThread(cgroup, pid) < 0)
- goto cleanup;
-
}
if (!affinity_cpumask)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b9e9a7d320c4..8baa88287567 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2630,6 +2630,11 @@ qemuProcessSetupPid(virDomainObj *vm,
if (virCgroupNewThread(priv->cgroup, nameval, id, true, &cgroup) < 0)
goto cleanup;
+ /* Move the thread to the sub dir before changing the settings so that
+ * all take effect even with cgroupv2. */
+ if (virCgroupAddThread(cgroup, pid) < 0)
+ goto cleanup;
+
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
if (use_cpumask &&
virDomainCgroupSetupCpusetCpus(cgroup, use_cpumask) < 0)
@@ -2642,11 +2647,6 @@ qemuProcessSetupPid(virDomainObj *vm,
if (virDomainCgroupSetupVcpuBW(cgroup, period, quota) < 0)
goto cleanup;
-
- /* Move the thread to the sub dir */
- if (virCgroupAddThread(cgroup, pid) < 0)
- goto cleanup;
-
}
if (!affinity_cpumask)
--
2.40.0