diff options
author | Martin Kletzander <mkletzan@redhat.com> | 2023-04-14 12:08:59 +0200 |
---|---|---|
committer | Martin Kletzander <mkletzan@redhat.com> | 2023-04-20 12:39:49 +0200 |
commit | 383caddea103eaab7bb495ec446b43748677f749 (patch) | |
tree | 6b387321f6ec9a881c0718c648bc6a6cd4bbb2a7 | |
parent | d2af152d1fb5560bc7c9ad94c1c93179d62f9270 (diff) | |
download | libvirt-383caddea103eaab7bb495ec446b43748677f749.tar.gz |
qemu, ch: Move threads to cgroup dir before changing parameters
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>
-rw-r--r-- | src/ch/ch_process.c | 12 | ||||
-rw-r--r-- | 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 c145a78496..44c5b0611e 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 b9e9a7d320..8baa882875 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) |