提交 a06ef207 编写于 作者: P Peter Krempa 提交者: Daniel P. Berrange

qemu: process: Move emulator thread setting code into one function

Similarly to the refactors to iothreads and vcpus, move the code that
initializes the emulator thread settings into single function.
上级 b4a5fd95
...@@ -1061,72 +1061,6 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, ...@@ -1061,72 +1061,6 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup,
} }
int
qemuSetupCgroupForEmulator(virDomainObjPtr vm)
{
virBitmapPtr cpumask = NULL;
virCgroupPtr cgroup_emulator = NULL;
virDomainDefPtr def = vm->def;
qemuDomainObjPrivatePtr priv = vm->privateData;
unsigned long long period = vm->def->cputune.emulator_period;
long long quota = vm->def->cputune.emulator_quota;
if ((period || quota) &&
!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("cgroup cpu is required for scheduler tuning"));
return -1;
}
/*
* If CPU cgroup controller is not initialized here, then we need
* neither period nor quota settings. And if CPUSET controller is
* not initialized either, then there's nothing to do anyway.
*/
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) &&
!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
return 0;
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
true, &cgroup_emulator) < 0)
goto cleanup;
if (virCgroupMoveTask(priv->cgroup, cgroup_emulator) < 0)
goto cleanup;
if (def->cputune.emulatorpin)
cpumask = def->cputune.emulatorpin;
else if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
cpumask = priv->autoCpuset;
else if (def->cpumask)
cpumask = def->cpumask;
if (cpumask) {
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET) &&
qemuSetupCgroupCpusetCpus(cgroup_emulator, cpumask) < 0)
goto cleanup;
}
if (period || quota) {
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) &&
qemuSetupCgroupVcpuBW(cgroup_emulator, period,
quota) < 0)
goto cleanup;
}
virCgroupFree(&cgroup_emulator);
return 0;
cleanup:
if (cgroup_emulator) {
virCgroupRemove(cgroup_emulator);
virCgroupFree(&cgroup_emulator);
}
return -1;
}
int int
qemuRemoveCgroup(virDomainObjPtr vm) qemuRemoveCgroup(virDomainObjPtr vm)
{ {
......
...@@ -54,7 +54,6 @@ int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup, ...@@ -54,7 +54,6 @@ int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup,
unsigned long long period, unsigned long long period,
long long quota); long long quota);
int qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, virBitmapPtr cpumask); int qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, virBitmapPtr cpumask);
int qemuSetupCgroupForEmulator(virDomainObjPtr vm);
int qemuRemoveCgroup(virDomainObjPtr vm); int qemuRemoveCgroup(virDomainObjPtr vm);
#endif /* __QEMU_CGROUP_H__ */ #endif /* __QEMU_CGROUP_H__ */
...@@ -2185,22 +2185,72 @@ qemuProcessSetLinkStates(virQEMUDriverPtr driver, ...@@ -2185,22 +2185,72 @@ qemuProcessSetLinkStates(virQEMUDriverPtr driver,
} }
/* Set CPU affinities for emulator threads. */
static int static int
qemuProcessSetEmulatorAffinity(virDomainObjPtr vm) qemuProcessSetupEmulator(virDomainObjPtr vm)
{ {
virBitmapPtr cpumask; virBitmapPtr cpumask = NULL;
virDomainDefPtr def = vm->def; virCgroupPtr cgroup_emulator = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
unsigned long long period = vm->def->cputune.emulator_period;
long long quota = vm->def->cputune.emulator_quota;
int ret = -1; int ret = -1;
if (def->cputune.emulatorpin) if ((period || quota) &&
cpumask = def->cputune.emulatorpin; !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
else if (def->cpumask) virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
cpumask = def->cpumask; _("cgroup cpu is required for scheduler tuning"));
return -1;
}
if (vm->def->cputune.emulatorpin)
cpumask = vm->def->cputune.emulatorpin;
else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO &&
priv->autoCpuset)
cpumask = priv->autoCpuset;
else else
return 0; cpumask = vm->def->cpumask;
/* If CPU cgroup controller is not initialized here, then we need
* neither period nor quota settings. And if CPUSET controller is
* not initialized either, then there's nothing to do anyway. */
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) ||
virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_EMULATOR, 0,
true, &cgroup_emulator) < 0)
goto cleanup;
if (virCgroupMoveTask(priv->cgroup, cgroup_emulator) < 0)
goto cleanup;
if (cpumask) {
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET) &&
qemuSetupCgroupCpusetCpus(cgroup_emulator, cpumask) < 0)
goto cleanup;
}
if (period || quota) {
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) &&
qemuSetupCgroupVcpuBW(cgroup_emulator, period,
quota) < 0)
goto cleanup;
}
}
if (cpumask &&
virProcessSetAffinity(vm->pid, cpumask) < 0)
goto cleanup;
ret = 0;
cleanup:
if (cgroup_emulator) {
if (ret < 0)
virCgroupRemove(cgroup_emulator);
virCgroupFree(&cgroup_emulator);
}
ret = virProcessSetAffinity(vm->pid, cpumask);
return ret; return ret;
} }
...@@ -5147,12 +5197,8 @@ qemuProcessLaunch(virConnectPtr conn, ...@@ -5147,12 +5197,8 @@ qemuProcessLaunch(virConnectPtr conn,
if (rv == -1) /* The VM failed to start */ if (rv == -1) /* The VM failed to start */
goto cleanup; goto cleanup;
VIR_DEBUG("Setting cgroup for emulator (if required)"); VIR_DEBUG("Setting emulator tuning/settings");
if (qemuSetupCgroupForEmulator(vm) < 0) if (qemuProcessSetupEmulator(vm) < 0)
goto cleanup;
VIR_DEBUG("Setting affinity of emulator threads");
if (qemuProcessSetEmulatorAffinity(vm) < 0)
goto cleanup; goto cleanup;
VIR_DEBUG("Waiting for monitor to show up"); VIR_DEBUG("Waiting for monitor to show up");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册