qemu_cgroup: introduce qemuRestoreCgroupThread helper

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
Pavel Hrdina 2020-09-22 14:05:50 +02:00
parent b31aa165e8
commit 29c85e1664

View File

@ -960,16 +960,41 @@ qemuInitCgroup(virDomainObjPtr vm,
return 0; return 0;
} }
static int
qemuRestoreCgroupThread(virCgroupPtr cgroup,
virCgroupThreadName thread,
int id)
{
virCgroupPtr cgroup_temp = NULL;
g_autofree char *nodeset = NULL;
int ret = -1;
if (virCgroupNewThread(cgroup, thread, id, false, &cgroup_temp) < 0)
goto cleanup;
if (virCgroupSetCpusetMemoryMigrate(cgroup_temp, true) < 0)
goto cleanup;
if (virCgroupGetCpusetMems(cgroup_temp, &nodeset) < 0)
goto cleanup;
if (virCgroupSetCpusetMems(cgroup_temp, nodeset) < 0)
goto cleanup;
ret = 0;
cleanup:
virCgroupFree(&cgroup_temp);
return ret;
}
static void static void
qemuRestoreCgroupState(virDomainObjPtr vm) qemuRestoreCgroupState(virDomainObjPtr vm)
{ {
g_autofree char *mem_mask = NULL; g_autofree char *mem_mask = NULL;
g_autofree char *nodeset = NULL;
int empty = -1; int empty = -1;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
size_t i = 0; size_t i = 0;
g_autoptr(virBitmap) all_nodes = NULL; g_autoptr(virBitmap) all_nodes = NULL;
virCgroupPtr cgroup_temp = NULL;
if (!virNumaIsAvailable() || if (!virNumaIsAvailable() ||
!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
@ -994,45 +1019,27 @@ qemuRestoreCgroupState(virDomainObjPtr vm)
if (!vcpu->online) if (!vcpu->online)
continue; continue;
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, i, if (qemuRestoreCgroupThread(priv->cgroup,
false, &cgroup_temp) < 0 || VIR_CGROUP_THREAD_VCPU, i) < 0)
virCgroupSetCpusetMemoryMigrate(cgroup_temp, true) < 0 || return;
virCgroupGetCpusetMems(cgroup_temp, &nodeset) < 0 ||
virCgroupSetCpusetMems(cgroup_temp, nodeset) < 0)
goto cleanup;
VIR_FREE(nodeset);
virCgroupFree(&cgroup_temp);
} }
for (i = 0; i < vm->def->niothreadids; i++) { for (i = 0; i < vm->def->niothreadids; i++) {
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_IOTHREAD, if (qemuRestoreCgroupThread(priv->cgroup, VIR_CGROUP_THREAD_IOTHREAD,
vm->def->iothreadids[i]->iothread_id, vm->def->iothreadids[i]->iothread_id) < 0)
false, &cgroup_temp) < 0 || return;
virCgroupSetCpusetMemoryMigrate(cgroup_temp, true) < 0 ||
virCgroupGetCpusetMems(cgroup_temp, &nodeset) < 0 ||
virCgroupSetCpusetMems(cgroup_temp, nodeset) < 0)
goto cleanup;
VIR_FREE(nodeset);
virCgroupFree(&cgroup_temp);
} }
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0, if (qemuRestoreCgroupThread(priv->cgroup,
false, &cgroup_temp) < 0 || VIR_CGROUP_THREAD_EMULATOR, 0) < 0)
virCgroupSetCpusetMemoryMigrate(cgroup_temp, true) < 0 || return;
virCgroupGetCpusetMems(cgroup_temp, &nodeset) < 0 ||
virCgroupSetCpusetMems(cgroup_temp, nodeset) < 0)
goto cleanup;
cleanup:
virCgroupFree(&cgroup_temp);
return; return;
error: error:
virResetLastError(); virResetLastError();
VIR_DEBUG("Couldn't restore cgroups to meaningful state"); VIR_DEBUG("Couldn't restore cgroups to meaningful state");
goto cleanup; return;
} }
int int