]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu, ch: Move threads to cgroup dir before changing parameters
authorMartin Kletzander <mkletzan@redhat.com>
Fri, 14 Apr 2023 10:08:59 +0000 (12:08 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Thu, 20 Apr 2023 10:39:49 +0000 (12:39 +0200)
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@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/ch/ch_process.c
src/qemu/qemu_process.c

index c145a7849647823619ecfa0ff9f2144bd31ab0fa..44c5b0611ef5d553f5052adbd1591541626ab0f0 100644 (file)
@@ -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)
index b9e9a7d320c4b00b6d7b4b5af7dd2461e260b482..8baa8828756760009c0e8792a412c5bc5a57b491 100644 (file)
@@ -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)