[libvirt] [PATCH 08/11] libxl: use job functions in vcpu set and pin functions
Michal Privoznik
mprivozn at redhat.com
Tue Feb 11 14:36:55 UTC 2014
On 07.02.2014 04:53, Jim Fehlig wrote:
> These operations aren't necessarily time consuming, but need to
> wait in the queue of modify jobs.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
> src/libxl/libxl_driver.c | 46 +++++++++++++++++++++++++++++-----------------
> 1 file changed, 29 insertions(+), 17 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 84d9ca3..7ce127a 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -2322,22 +2322,25 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> if (virDomainSetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
> goto cleanup;
>
> + if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
> + goto cleanup;
> +
> if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_VCPU_LIVE)) {
> virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> _("cannot set vcpus on an inactive domain"));
> - goto cleanup;
> + goto endjob;
> }
>
> if (!vm->persistent && (flags & VIR_DOMAIN_VCPU_CONFIG)) {
> virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> _("cannot change persistent config of a transient domain"));
> - goto cleanup;
> + goto endjob;
> }
>
> if ((max = libxlConnectGetMaxVcpus(dom->conn, NULL)) < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> _("could not determine max vcpus for the domain"));
> - goto cleanup;
> + goto endjob;
> }
>
> if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM) && vm->def->maxvcpus < max) {
> @@ -2348,17 +2351,17 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> virReportError(VIR_ERR_INVALID_ARG,
> _("requested vcpus is greater than max allowable"
> " vcpus for the domain: %d > %d"), nvcpus, max);
> - goto cleanup;
> + goto endjob;
> }
>
> priv = vm->privateData;
>
> if (!(def = virDomainObjGetPersistentDef(cfg->caps, driver->xmlopt, vm)))
> - goto cleanup;
> + goto endjob;
>
> maplen = VIR_CPU_MAPLEN(nvcpus);
> if (VIR_ALLOC_N(bitmask, maplen) < 0)
> - goto cleanup;
> + goto endjob;
>
> for (i = 0; i < nvcpus; ++i) {
> pos = i / 8;
> @@ -2384,7 +2387,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to set vcpus for domain '%d'"
> " with libxenlight"), dom->id);
> - goto cleanup;
> + goto endjob;
> }
> break;
>
> @@ -2393,7 +2396,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to set vcpus for domain '%d'"
> " with libxenlight"), dom->id);
> - goto cleanup;
> + goto endjob;
> }
> def->vcpus = nvcpus;
> break;
> @@ -2404,6 +2407,9 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> if (flags & VIR_DOMAIN_VCPU_CONFIG)
> ret = virDomainSaveConfig(cfg->configDir, def);
>
> +endjob:
> + libxlDomainObjEndJob(driver, vm);
> +
> cleanup:
> VIR_FREE(bitmask);
> if (vm)
> @@ -2495,15 +2501,18 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
> if (virDomainPinVcpuFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
> goto cleanup;
>
> + if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
> + goto cleanup;
> +
> if ((flags & VIR_DOMAIN_AFFECT_LIVE) && !virDomainObjIsActive(vm)) {
> virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> _("domain is inactive"));
> - goto cleanup;
> + goto endjob;
> }
>
> if (virDomainLiveConfigHelperMethod(cfg->caps, driver->xmlopt, vm,
> &flags, &targetDef) < 0)
> - goto cleanup;
> + goto endjob;
>
> if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> targetDef = vm->def;
> @@ -2514,7 +2523,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
>
> pcpumap = virBitmapNewData(cpumap, maplen);
> if (!pcpumap)
> - goto cleanup;
> + goto endjob;
>
> if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> libxl_bitmap map = { .size = maplen, .map = cpumap };
> @@ -2525,7 +2534,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to pin vcpu '%d' with libxenlight"),
> vcpu);
> - goto cleanup;
> + goto endjob;
> }
> }
>
> @@ -2535,14 +2544,14 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to delete vcpupin xml for vcpu '%d'"),
> vcpu);
> - goto cleanup;
> + goto endjob;
> }
> - goto out;
> + goto done;
> }
>
> if (!targetDef->cputune.vcpupin) {
> if (VIR_ALLOC(targetDef->cputune.vcpupin) < 0)
> - goto cleanup;
> + goto endjob;
> targetDef->cputune.nvcpupin = 0;
> }
> if (virDomainVcpuPinAdd(&targetDef->cputune.vcpupin,
> @@ -2552,10 +2561,10 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
> vcpu) < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> "%s", _("failed to update or add vcpupin xml"));
> - goto cleanup;
> + goto endjob;
> }
>
> -out:
> +done:
> ret = 0;
>
> if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> @@ -2564,6 +2573,9 @@ out:
> ret = virDomainSaveConfig(cfg->configDir, targetDef);
> }
>
> +endjob:
> + libxlDomainObjEndJob(driver, vm);
> +
> cleanup:
> if (vm)
> virObjectUnlock(vm);
>
Conditional ACK
Michal
More information about the libvir-list
mailing list