[PATCH 1/2] qemu, ch: Move threads to cgroup dir before changing parameters

Martin Kletzander mkletzan at redhat.com
Thu Apr 20 08:49:18 UTC 2023


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 at 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



More information about the libvir-list mailing list