[libvirt] [PATCH 8/8] Add domainSuspend/Resume to libxl driver

Jim Fehlig jfehlig at novell.com
Thu Mar 24 15:55:23 UTC 2011


Markus Groß wrote:
> ---
>  src/libxl/libxl_driver.c |  114 +++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 112 insertions(+), 2 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 4b31197..669c170 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1041,6 +1041,116 @@ libxlDomainLookupByName(virConnectPtr conn, const char *name)
>  }
>  
>  static int
> +libxlDomainSuspend(virDomainPtr dom)
> +{
> +    libxlDriverPrivatePtr driver = dom->conn->privateData;
> +    virDomainObjPtr vm;
> +    libxlDomainObjPrivatePtr priv;
> +    virDomainEventPtr event = NULL;
> +    int ret = -1;
> +
> +    libxlDriverLock(driver);
> +    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
>   

Is there any reason the driver can't be unlocked here?

> +
> +    if (!vm) {
> +        char uuidstr[VIR_UUID_STRING_BUFLEN];
> +        virUUIDFormat(dom->uuid, uuidstr);
> +        libxlError(VIR_ERR_NO_DOMAIN,
> +                   _("No domain with matching uuid '%s'"), uuidstr);
> +        goto cleanup;
> +    }
> +    if (!virDomainObjIsActive(vm)) {
> +        libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running"));
> +        goto cleanup;
> +    }
> +
> +    priv = vm->privateData;
> +
> +    if (vm->state != VIR_DOMAIN_PAUSED) {
> +        if (libxl_domain_pause(&priv->ctx, dom->id) != 0) {
> +            libxlError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Failed to suspend domain '%d' with libxenlight"),
> +                       dom->id);
> +            goto cleanup;
> +        }
> +
> +        vm->state = VIR_DOMAIN_PAUSED;
> +
> +        event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_SUSPENDED,
> +                                         VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
>   

Hmm, I need to review patch 1 in this series.  I skipped it initially
since I'm not yet familiar with the event code.

> +    }
> +
> +    if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> +
> +cleanup:
> +    if (vm)
> +        virDomainObjUnlock(vm);
> +    if (event)
> +        libxlDomainEventQueue(driver, event);
> +    libxlDriverUnlock(driver);
> +    return ret;
> +}
> +
> +
> +static int
> +libxlDomainResume(virDomainPtr dom)
> +{
> +    libxlDriverPrivatePtr driver = dom->conn->privateData;
> +    virDomainObjPtr vm;
> +    libxlDomainObjPrivatePtr priv;
> +    virDomainEventPtr event = NULL;
> +    int ret = -1;
> +
> +    libxlDriverLock(driver);
> +    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
>   

Same question here about unlocking the driver.

Regards,
Jim

> +
> +    if (!vm) {
> +        char uuidstr[VIR_UUID_STRING_BUFLEN];
> +        virUUIDFormat(dom->uuid, uuidstr);
> +        libxlError(VIR_ERR_NO_DOMAIN,
> +                   _("No domain with matching uuid '%s'"), uuidstr);
> +        goto cleanup;
> +    }
> +
> +    if (!virDomainObjIsActive(vm)) {
> +        libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running"));
> +        goto cleanup;
> +    }
> +
> +    priv = vm->privateData;
> +
> +    if (vm->state == VIR_DOMAIN_PAUSED) {
> +        if (libxl_domain_unpause(&priv->ctx, dom->id) != 0) {
> +            libxlError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Failed to resume domain '%d' with libxenlight"),
> +                       dom->id);
> +            goto cleanup;
> +        }
> +
> +        vm->state = VIR_DOMAIN_RUNNING;
> +
> +        event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_RESUMED,
> +                                         VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
> +    }
> +
> +    if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> +
> +cleanup:
> +    if (vm)
> +        virDomainObjUnlock(vm);
> +    if (event)
> +        libxlDomainEventQueue(driver, event);
> +    libxlDriverUnlock(driver);
> +    return ret;
> +}
> +
> +static int
>  libxlDomainShutdown(virDomainPtr dom)
>  {
>      libxlDriverPrivatePtr driver = dom->conn->privateData;
> @@ -2130,8 +2240,8 @@ static virDriver libxlDriver = {
>      libxlDomainLookupByID,      /* domainLookupByID */
>      libxlDomainLookupByUUID,    /* domainLookupByUUID */
>      libxlDomainLookupByName,    /* domainLookupByName */
> -    NULL,                       /* domainSuspend */
> -    NULL,                       /* domainResume */
> +    libxlDomainSuspend,         /* domainSuspend */
> +    libxlDomainResume,          /* domainResume */
>      libxlDomainShutdown,        /* domainShutdown */
>      libxlDomainReboot,          /* domainReboot */
>      libxlDomainDestroy,         /* domainDestroy */
>   




More information about the libvir-list mailing list