[libvirt] [PATCH 1/2] qemu: process: Move emulator thread setting code into one function
John Ferlan
jferlan at redhat.com
Thu Feb 25 23:18:09 UTC 2016
On 02/24/2016 08:45 AM, Peter Krempa wrote:
> Similarly to the refactors to iothreads and vcpus, move the code that
> initializes the emulator thread settings into single function.
> ---
> src/qemu/qemu_cgroup.c | 66 -----------------------------------------
> src/qemu/qemu_cgroup.h | 1 -
> src/qemu/qemu_process.c | 78 +++++++++++++++++++++++++++++++++++++++----------
> 3 files changed, 62 insertions(+), 83 deletions(-)
>
This is going to conflict with Henning Schild's series:
http://www.redhat.com/archives/libvir-list/2016-February/msg01157.html
In particular:
http://www.redhat.com/archives/libvir-list/2016-February/msg01166.html
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index f3c5fbb..a294bb0 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -1062,72 +1062,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
> qemuRemoveCgroup(virDomainObjPtr vm)
> {
> qemuDomainObjPrivatePtr priv = vm->privateData;
> diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h
> index a8b8e1b..7a9d10a 100644
> --- a/src/qemu/qemu_cgroup.h
> +++ b/src/qemu/qemu_cgroup.h
> @@ -54,7 +54,6 @@ int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup,
> unsigned long long period,
> long long quota);
> int qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, virBitmapPtr cpumask);
> -int qemuSetupCgroupForEmulator(virDomainObjPtr vm);
> int qemuRemoveCgroup(virDomainObjPtr vm);
>
> #endif /* __QEMU_CGROUP_H__ */
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index e760182..07b7d63 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2185,22 +2185,72 @@ qemuProcessSetLinkStates(virQEMUDriverPtr driver,
> }
>
>
> -/* Set CPU affinities for emulator threads. */
> static int
> -qemuProcessSetEmulatorAffinity(virDomainObjPtr vm)
> +qemuProcessSetupEmulator(virDomainObjPtr vm)
> {
> - virBitmapPtr cpumask;
> - virDomainDefPtr def = vm->def;
> + virBitmapPtr cpumask = NULL;
> + 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;
>
> - if (def->cputune.emulatorpin)
> - cpumask = def->cputune.emulatorpin;
> - else if (def->cpumask)
> - cpumask = def->cpumask;
> + 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 (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
> - 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;
> }
>
> @@ -5135,12 +5185,8 @@ qemuProcessLaunch(virConnectPtr conn,
> if (rv == -1) /* The VM failed to start */
> goto cleanup;
>
> - VIR_DEBUG("Setting cgroup for emulator (if required)");
> - if (qemuSetupCgroupForEmulator(vm) < 0)
> - goto cleanup;
> -
> - VIR_DEBUG("Setting affinity of emulator threads");
> - if (qemuProcessSetEmulatorAffinity(vm) < 0)
> + VIR_DEBUG("Setting emulator tuning/settings");
> + if (qemuProcessSetupEmulator(vm) < 0)
Interesting to note in the other series the SetupCgroupForEmulator was
moved to right after qemuSetupCgroup - whether that's exactly right, I'm
not sure; however, is it reasonable to move the new call to below
qemuProcessInitCpuAffinity? Before the labeling starts?
There perhaps is even more overlap between those two since the
InitCpuAffinity will virProcessSetAffinity for vm->pid just like the new
qemuProcessSetupEmulator.
Hopefully you, Dan, and Henning can work all this out...
John
> goto cleanup;
>
> VIR_DEBUG("Waiting for monitor to show up");
>
More information about the libvir-list
mailing list