mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: driver: Extract setting of live vcpu count
The live code does ugly things. Contain it in a separate function.
This commit is contained in:
parent
f10da2f553
commit
2fa7db93de
@ -4791,6 +4791,72 @@ qemuDomainSetVcpusMax(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainSetVcpusLive(virQEMUDriverPtr driver,
|
||||||
|
virQEMUDriverConfigPtr cfg,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
unsigned int nvcpus)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
size_t i;
|
||||||
|
virCgroupPtr cgroup_temp = NULL;
|
||||||
|
char *mem_mask = NULL;
|
||||||
|
char *all_nodes_str = NULL;
|
||||||
|
virBitmapPtr all_nodes = NULL;
|
||||||
|
virErrorPtr err = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virNumaIsAvailable() &&
|
||||||
|
virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
|
||||||
|
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
|
||||||
|
false, &cgroup_temp) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(all_nodes = virNumaGetHostNodeset()))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(all_nodes_str = virBitmapFormat(all_nodes)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virCgroupGetCpusetMems(cgroup_temp, &mem_mask) < 0 ||
|
||||||
|
virCgroupSetCpusetMems(cgroup_temp, all_nodes_str) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nvcpus > virDomainDefGetVcpus(vm->def)) {
|
||||||
|
for (i = virDomainDefGetVcpus(vm->def); i < nvcpus; i++) {
|
||||||
|
if (qemuDomainHotplugAddVcpu(driver, vm, i) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = virDomainDefGetVcpus(vm->def) - 1; i >= nvcpus; i--) {
|
||||||
|
if (qemuDomainHotplugDelVcpu(driver, vm, i) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (mem_mask) {
|
||||||
|
err = virSaveLastError();
|
||||||
|
virCgroupSetCpusetMems(cgroup_temp, mem_mask);
|
||||||
|
virSetError(err);
|
||||||
|
virFreeError(err);
|
||||||
|
VIR_FREE(mem_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_FREE(all_nodes_str);
|
||||||
|
virBitmapFree(all_nodes);
|
||||||
|
virCgroupFree(&cgroup_temp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
@ -4801,13 +4867,6 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|||||||
virDomainDefPtr persistentDef;
|
virDomainDefPtr persistentDef;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
virQEMUDriverConfigPtr cfg = NULL;
|
virQEMUDriverConfigPtr cfg = NULL;
|
||||||
qemuDomainObjPrivatePtr priv;
|
|
||||||
size_t i;
|
|
||||||
virCgroupPtr cgroup_temp = NULL;
|
|
||||||
char *mem_mask = NULL;
|
|
||||||
char *all_nodes_str = NULL;
|
|
||||||
virBitmapPtr all_nodes = NULL;
|
|
||||||
virErrorPtr err = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
|
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
|
||||||
VIR_DOMAIN_AFFECT_CONFIG |
|
VIR_DOMAIN_AFFECT_CONFIG |
|
||||||
@ -4822,8 +4881,6 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|||||||
if (virDomainSetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
|
if (virDomainSetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
priv = vm->privateData;
|
|
||||||
|
|
||||||
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
|
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -4860,39 +4917,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (def && virNumaIsAvailable() &&
|
if (def && qemuDomainSetVcpusLive(driver, cfg, vm, nvcpus) < 0)
|
||||||
virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
|
goto endjob;
|
||||||
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
|
|
||||||
false, &cgroup_temp) < 0)
|
|
||||||
goto endjob;
|
|
||||||
|
|
||||||
if (!(all_nodes = virNumaGetHostNodeset()))
|
|
||||||
goto endjob;
|
|
||||||
|
|
||||||
if (!(all_nodes_str = virBitmapFormat(all_nodes)))
|
|
||||||
goto endjob;
|
|
||||||
|
|
||||||
if (virCgroupGetCpusetMems(cgroup_temp, &mem_mask) < 0 ||
|
|
||||||
virCgroupSetCpusetMems(cgroup_temp, all_nodes_str) < 0)
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (def) {
|
|
||||||
if (nvcpus > virDomainDefGetVcpus(def)) {
|
|
||||||
for (i = virDomainDefGetVcpus(def); i < nvcpus; i++) {
|
|
||||||
if (qemuDomainHotplugAddVcpu(driver, vm, i) < 0)
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = virDomainDefGetVcpus(def) - 1; i >= nvcpus; i--) {
|
|
||||||
if (qemuDomainHotplugDelVcpu(driver, vm, i) < 0)
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (persistentDef) {
|
if (persistentDef) {
|
||||||
if (virDomainDefSetVcpus(persistentDef, nvcpus) < 0)
|
if (virDomainDefSetVcpus(persistentDef, nvcpus) < 0)
|
||||||
@ -4906,21 +4932,10 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
endjob:
|
endjob:
|
||||||
if (mem_mask) {
|
|
||||||
err = virSaveLastError();
|
|
||||||
virCgroupSetCpusetMems(cgroup_temp, mem_mask);
|
|
||||||
virSetError(err);
|
|
||||||
virFreeError(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
qemuDomainObjEndJob(driver, vm);
|
qemuDomainObjEndJob(driver, vm);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virDomainObjEndAPI(&vm);
|
virDomainObjEndAPI(&vm);
|
||||||
VIR_FREE(mem_mask);
|
|
||||||
VIR_FREE(all_nodes_str);
|
|
||||||
virBitmapFree(all_nodes);
|
|
||||||
virCgroupFree(&cgroup_temp);
|
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user