On Thu, 2016-01-14 at 14:28 +0300, Dmitry Guryanov wrote:
On Tue, 2016-01-12 at 19:42 +0300, Alexander Burluka wrote:
> This functions setups per-domain cpu bandwidth parameters
>
> Signed-off-by: Alexander Burluka <aburluka(a)virtuozzo.com>
> ---
> src/qemu/qemu_cgroup.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_cgroup.h | 1 +
> src/qemu/qemu_process.c | 4 ++++
> 3 files changed, 69 insertions(+)
>
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index e835ac4..53002b7 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -1002,6 +1002,70 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup,
> }
>
> int
> +qemuSetupGlobalCpuCgroup(virDomainObjPtr vm)
> +{
> + virCgroupPtr cgroup_vcpu = NULL;
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + unsigned long long period = vm->def->cputune.global_period;
> + long long quota = vm->def->cputune.global_quota;
> + char *mem_mask = NULL;
> + virDomainNumatuneMemMode mem_mode;
> +
> + 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;
> +
> + /* We are trying to setup cgroups for CPU pinning, which can also be done
> + * with virProcessSetAffinity, thus the lack of cgroups is not fatal here.
> + */
> + if (priv->cgroup == NULL)
> + return 0;
> +
> + if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0
&&
> + mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
> + virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
> + priv->autoNodeset,
> + &mem_mask, -1) < 0)
> + goto cleanup;
> +
> + if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_GLOBAL, 0,
> + true, &cgroup_vcpu) < 0)
> + goto cleanup;
> +
> + if (period || quota) {
> + if (qemuSetupBandwidthCgroup(cgroup_vcpu, period, quota) < 0)
> + goto cleanup;
> + }
I think you could just use priv->cgroup and don't call virCgroupNewThread, so the
previous patch is not needed.
Sorry, not previous, 4th.
> +
> + virCgroupFree(&cgroup_vcpu);
> + VIR_FREE(mem_mask);
> +
> + return 0;
> +
> + cleanup:
> + if (cgroup_vcpu) {
> + virCgroupRemove(cgroup_vcpu);
> + virCgroupFree(&cgroup_vcpu);
> + }
> + VIR_FREE(mem_mask);
> +
> + return -1;
> +}
> +
> +
> +int
> qemuSetupCgroupForVcpu(virDomainObjPtr vm)
> {
> virCgroupPtr cgroup_vcpu = NULL;
> diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h
> index 17da920..75f9eb7 100644
> --- a/src/qemu/qemu_cgroup.h
> +++ b/src/qemu/qemu_cgroup.h
> @@ -54,6 +54,7 @@ int qemuSetupBandwidthCgroup(virCgroupPtr cgroup,
> long long quota);
> int qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, virBitmapPtr cpumask);
> int qemuSetupCgroupForVcpu(virDomainObjPtr vm);
> +int qemuSetupGlobalCpuCgroup(virDomainObjPtr vm);
> int qemuSetupCgroupForIOThreads(virDomainObjPtr vm);
> int qemuSetupCgroupForEmulator(virDomainObjPtr vm);
> int qemuRemoveCgroup(virQEMUDriverPtr driver, virDomainObjPtr vm);
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 3d9e0e5..7a90457 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -4981,6 +4981,10 @@ qemuProcessLaunch(virConnectPtr conn,
> if (qemuProcessDetectIOThreadPIDs(driver, vm, asyncJob) < 0)
> goto cleanup;
>
> + VIR_DEBUG("Setting global CPU cgroup (if required)");
> + if (qemuSetupGlobalCpuCgroup(vm) < 0)
> + goto cleanup;
> +
> VIR_DEBUG("Setting cgroup for each VCPU (if required)");
> if (qemuSetupCgroupForVcpu(vm) < 0)
> goto cleanup;
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list