[libvirt] [PATCH 06/11] libxl: use job functions in domain save operations

Michal Privoznik mprivozn at redhat.com
Tue Feb 11 14:36:01 UTC 2014


On 07.02.2014 04:53, Jim Fehlig wrote:
> Saving domain memory and cpu state can take considerable time.
> Use the recently added job functions and unlock the virDomainObj
> while saving the domain.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>   src/libxl/libxl_driver.c | 54 ++++++++++++++++++++++++++++++++++--------------
>   1 file changed, 39 insertions(+), 15 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index bb574bc..a804b45 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1900,10 +1900,16 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
>           goto cleanup;
>       }
>
> -    if (libxl_domain_suspend(priv->ctx, vm->def->id, fd, 0, NULL) != 0) {
> +    /* Unlock virDomainObj while saving domain */
> +    virObjectUnlock(vm);
> +    ret = libxl_domain_suspend(priv->ctx, vm->def->id, fd, 0, NULL);
> +    virObjectLock(vm);
> +
> +    if (ret != 0) {
>           virReportError(VIR_ERR_INTERNAL_ERROR,
>                          _("Failed to save domain '%d' with libxenlight"),
>                          vm->def->id);
> +        ret = -1;
>           goto cleanup;
>       }
>
> @@ -1935,6 +1941,7 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *to, const char *dxml,
>       libxlDriverPrivatePtr driver = dom->conn->privateData;
>       virDomainObjPtr vm;
>       int ret = -1;
> +    bool remove_dom = false;
>
>       virCheckFlags(0, -1);
>       if (dxml) {
> @@ -1949,22 +1956,30 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *to, const char *dxml,
>       if (virDomainSaveFlagsEnsureACL(dom->conn, vm->def) < 0)
>           goto cleanup;
>
> +    if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
> +        goto cleanup;
> +
>       if (!virDomainObjIsActive(vm)) {
>           virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running"));
> -        goto cleanup;
> +        goto endjob;
>       }
>
>       if (libxlDoDomainSave(driver, vm, to) < 0)
> -        goto cleanup;
> +        goto endjob;
>
> -    if (!vm->persistent) {
> -        virDomainObjListRemove(driver->domains, vm);
> -        vm = NULL;
> -    }
> +    if (!vm->persistent)
> +        remove_dom = true;
>
>       ret = 0;
>
> +endjob:
> +    libxlDomainObjEndJob(driver, vm);
> +
>   cleanup:
> +    if (remove_dom) {
> +        virDomainObjListRemove(driver->domains, vm);
> +        vm = NULL;
> +    }
>       if (vm)
>           virObjectUnlock(vm);
>       return ret;
> @@ -2125,6 +2140,7 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned int flags)
>       virDomainObjPtr vm = NULL;
>       char *name = NULL;
>       int ret = -1;
> +    bool remove_dom = false;
>
>       virCheckFlags(0, -1);
>
> @@ -2134,33 +2150,41 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned int flags)
>       if (virDomainManagedSaveEnsureACL(dom->conn, vm->def) < 0)
>           goto cleanup;
>
> +    if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
> +        goto cleanup;
> +
>       if (!virDomainObjIsActive(vm)) {
>           virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running"));
> -        goto cleanup;
> +        goto endjob;
>       }
>       if (!vm->persistent) {
>           virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>                          _("cannot do managed save for transient domain"));
> -        goto cleanup;
> +        goto endjob;
>       }
>
>       name = libxlDomainManagedSavePath(driver, vm);
>       if (name == NULL)
> -        goto cleanup;
> +        goto endjob;
>
>       VIR_INFO("Saving state to %s", name);
>
>       if (libxlDoDomainSave(driver, vm, name) < 0)
> -        goto cleanup;
> +        goto endjob;
>
> -    if (!vm->persistent) {
> -        virDomainObjListRemove(driver->domains, vm);
> -        vm = NULL;
> -    }
> +    if (!vm->persistent)
> +        remove_dom = true;
>
>       ret = 0;
>
> +endjob:
> +    libxlDomainObjEndJob(driver, vm);
> +
>   cleanup:
> +    if (remove_dom) {
> +        virDomainObjListRemove(driver->domains, vm);
> +        vm = NULL;
> +    }
>       if (vm)
>           virObjectUnlock(vm);
>       VIR_FREE(name);
>

Conditional ACK

Michal




More information about the libvir-list mailing list