[libvirt] [PATCHv3 4/4] Support maximum and current memory flags in libxl driver

Daniel Veillard veillard at redhat.com
Tue May 31 05:06:10 UTC 2011


On Mon, May 30, 2011 at 11:53:03AM +0200, Markus Groß wrote:
> Add support to set the maximum memory of the domain.
> Also add support to change the memory of the current
> state of the domain, which translates to a running
> domain or the config of the domain.
> 
> Based on the code from the qemu driver.
> 
> ---
>  src/libxl/libxl_driver.c |  101 +++++++++++++++++++++++++++++++++-------------
>  1 files changed, 73 insertions(+), 28 deletions(-)
> 
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 0a2401a..3491f40 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1493,22 +1493,19 @@ cleanup:
>  }
>  
>  static int
> -libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory,
> +libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
>                            unsigned int flags)
>  {
>      libxlDriverPrivatePtr driver = dom->conn->privateData;
>      libxlDomainObjPrivatePtr priv;
>      virDomainObjPtr vm;
> -    virDomainDefPtr def = NULL;
> +    virDomainDefPtr persistentDef = NULL;
> +    bool isActive;
>      int ret = -1;
>  
>      virCheckFlags(VIR_DOMAIN_MEM_LIVE |
> -                  VIR_DOMAIN_MEM_CONFIG, -1);
> -
> -    if ((flags & (VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_CONFIG)) == 0) {
> -        libxlError(VIR_ERR_INVALID_ARG,
> -                   _("invalid flag combination: (0x%x)"), flags);
> -    }
> +                  VIR_DOMAIN_MEM_CONFIG |
> +                  VIR_DOMAIN_MEM_MAXIMUM, -1);
>  
>      libxlDriverLock(driver);
>      vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> @@ -1519,13 +1516,22 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory,
>          goto cleanup;
>      }
>  
> -    if (memory > vm->def->mem.max_balloon) {
> -        libxlError(VIR_ERR_INVALID_ARG, "%s",
> -                   _("cannot set memory higher than max memory"));
> -        goto cleanup;
> +    isActive = virDomainObjIsActive(vm);
> +
> +    if (flags == VIR_DOMAIN_MEM_CURRENT) {
> +        if (isActive)
> +            flags = VIR_DOMAIN_MEM_LIVE;
> +        else
> +            flags = VIR_DOMAIN_MEM_CONFIG;
> +    }
> +    if (flags == VIR_DOMAIN_MEM_MAXIMUM) {
> +        if (isActive)
> +            flags = VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_MAXIMUM;
> +        else
> +            flags = VIR_DOMAIN_MEM_CONFIG | VIR_DOMAIN_MEM_MAXIMUM;
>      }
>  
> -    if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_MEM_LIVE)) {
> +    if (!isActive && (flags & VIR_DOMAIN_MEM_LIVE)) {
>          libxlError(VIR_ERR_OPERATION_INVALID, "%s",
>                     _("cannot set memory on an inactive domain"));
>          goto cleanup;
> @@ -1537,31 +1543,63 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory,
>                         _("cannot change persistent config of a transient domain"));
>              goto cleanup;
>          }
> -        if (!(def = virDomainObjGetPersistentDef(driver->caps, vm)))
> +        if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm)))
>              goto cleanup;
>      }
>  
> -    if (flags & VIR_DOMAIN_MEM_LIVE) {
> -        priv = vm->privateData;
> +    if (flags & VIR_DOMAIN_MEM_MAXIMUM) {
> +        /* resize the maximum memory */
>  
> -        if (libxl_set_memory_target(&priv->ctx, dom->id, memory, 0,
> -                                    /* force */ 1) < 0) {
> -            libxlError(VIR_ERR_INTERNAL_ERROR,
> -                       _("Failed to set memory for domain '%d'"
> -                         " with libxenlight"), dom->id);
> +        if (flags & VIR_DOMAIN_MEM_LIVE) {
> +            priv = vm->privateData;
> +            if (libxl_domain_setmaxmem(&priv->ctx, dom->id, newmem) < 0) {
> +                libxlError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Failed to set maximum memory for domain '%d'"
> +                             " with libxenlight"), dom->id);
> +                goto cleanup;
> +            }
> +        }
> +
> +        if (flags & VIR_DOMAIN_MEM_CONFIG) {
> +            /* Help clang 2.8 decipher the logic flow.  */
> +            sa_assert(persistentDef);
> +            persistentDef->mem.max_balloon = newmem;
> +            if (persistentDef->mem.cur_balloon > newmem)
> +                persistentDef->mem.cur_balloon = newmem;
> +            ret = virDomainSaveConfig(driver->configDir, persistentDef);
>              goto cleanup;
>          }
> -    }
>  
> -    ret = 0;
> +    } else {
> +        /* resize the current memory */
>  
> -    if (flags & VIR_DOMAIN_MEM_CONFIG) {
> -        /* clang 2.9 needs an extra hint.  */
> -        sa_assert(def);
> -        def->mem.cur_balloon = memory;
> -        ret = virDomainSaveConfig(driver->configDir, def);
> +        if (newmem > vm->def->mem.max_balloon) {
> +            libxlError(VIR_ERR_INVALID_ARG, "%s",
> +                        _("cannot set memory higher than max memory"));
> +            goto cleanup;
> +        }
> +
> +        if (flags & VIR_DOMAIN_MEM_LIVE) {
> +            priv = vm->privateData;
> +            if (libxl_set_memory_target(&priv->ctx, dom->id, newmem, 0,
> +                                        /* force */ 1) < 0) {
> +                libxlError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Failed to set memory for domain '%d'"
> +                             " with libxenlight"), dom->id);
> +                goto cleanup;
> +            }
> +        }
> +
> +        if (flags & VIR_DOMAIN_MEM_CONFIG) {
> +            sa_assert(persistentDef);
> +            persistentDef->mem.cur_balloon = newmem;
> +            ret = virDomainSaveConfig(driver->configDir, persistentDef);
> +            goto cleanup;
> +        }
>      }
>  
> +    ret = 0;
> +
>  cleanup:
>      if (vm)
>          virDomainObjUnlock(vm);
> @@ -1575,6 +1613,12 @@ libxlDomainSetMemory(virDomainPtr dom, unsigned long memory)
>  }
>  
>  static int
> +libxlDomainSetMaxMemory(virDomainPtr dom, unsigned long memory)
> +{
> +    return libxlDomainSetMemoryFlags(dom, memory, VIR_DOMAIN_MEM_MAXIMUM);
> +}
> +
> +static int
>  libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
>  {
>      libxlDriverPrivatePtr driver = dom->conn->privateData;
> @@ -3552,6 +3596,7 @@ static virDriver libxlDriver = {
>      .domainDestroy = libxlDomainDestroy, /* 0.9.0 */
>      .domainGetOSType = libxlDomainGetOSType, /* 0.9.0 */
>      .domainGetMaxMemory = libxlDomainGetMaxMemory, /* 0.9.0 */
> +    .domainSetMaxMemory = libxlDomainSetMaxMemory, /* 0.9.2 */
>      .domainSetMemory = libxlDomainSetMemory, /* 0.9.0 */
>      .domainSetMemoryFlags = libxlDomainSetMemoryFlags, /* 0.9.0 */
>      .domainGetInfo = libxlDomainGetInfo, /* 0.9.0 */

  ACK, it's god to align the xen driver with qemu one here,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list