[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