Re: [libvirt] [PATCH v5 6/7] Implement qemuSetupGlobalCpuCgroup
18.01.2016 13:08, Alexander Burluka пишет: This functions setups per-domain cpu bandwidth parameters Signed-off-by: Alexander Burluka --- src/qemu/qemu_cgroup.c | 54 + src/qemu/qemu_cgroup.h | 1 + src/qemu/qemu_process.c | 4 3 files changed, 59 insertions(+) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 452d71d..1638bfe 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -1002,6 +1002,60 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, } int +qemuSetupGlobalCpuCgroup(virDomainObjPtr vm) +{ +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; This check is unnecessary because virCgroupHasController already has it. + +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; I'd like to see the reason in error message here similar to error path at the beginning of the function. + +if (period || quota) { +if (qemuSetupBandwidthCgroup(priv->cgroup, period, quota) < 0) +goto cleanup; +} + +VIR_FREE(mem_mask); + +return 0; + + cleanup: +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 05cbda2..96c7a6a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4982,6 +4982,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@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v5 6/7] Implement qemuSetupGlobalCpuCgroup
On Mon, 2016-01-18 at 13:08 +0300, Alexander Burluka wrote: > This functions setups per-domain cpu bandwidth parameters > > Signed-off-by: Alexander Burluka > --- > src/qemu/qemu_cgroup.c | 54 > + > src/qemu/qemu_cgroup.h | 1 + > src/qemu/qemu_process.c | 4 > 3 files changed, 59 insertions(+) > > diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c > index 452d71d..1638bfe 100644 > --- a/src/qemu/qemu_cgroup.c > +++ b/src/qemu/qemu_cgroup.c > @@ -1002,6 +1002,60 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, > } > > int > +qemuSetupGlobalCpuCgroup(virDomainObjPtr vm) > +{ > +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 (period || quota) { > +if (qemuSetupBandwidthCgroup(priv->cgroup, period, quota) < 0) > +goto cleanup; > +} > + > +VIR_FREE(mem_mask); > + > +return 0; > + > + cleanup: This path is aclually error, not cleanup. But I think it should prevent from pushing the patch, since it can be simply fixed in patch file. > +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 05cbda2..96c7a6a 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -4982,6 +4982,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@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v5 6/7] Implement qemuSetupGlobalCpuCgroup
This functions setups per-domain cpu bandwidth parameters Signed-off-by: Alexander Burluka --- src/qemu/qemu_cgroup.c | 54 + src/qemu/qemu_cgroup.h | 1 + src/qemu/qemu_process.c | 4 3 files changed, 59 insertions(+) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 452d71d..1638bfe 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -1002,6 +1002,60 @@ qemuSetupCgroupCpusetCpus(virCgroupPtr cgroup, } int +qemuSetupGlobalCpuCgroup(virDomainObjPtr vm) +{ +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 (period || quota) { +if (qemuSetupBandwidthCgroup(priv->cgroup, period, quota) < 0) +goto cleanup; +} + +VIR_FREE(mem_mask); + +return 0; + + cleanup: +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 05cbda2..96c7a6a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4982,6 +4982,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; -- 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list