[libvirt] [PATCH v3 04/13] XML parsing for memory tunables

Balbir Singh balbir at linux.vnet.ibm.com
Mon Oct 4 06:46:42 UTC 2010


* Nikunj A. Dadhania <nikunj at linux.vnet.ibm.com> [2010-09-28 15:26:30]:

> From: Nikunj A. Dadhania <nikunj at linux.vnet.ibm.com>
> 
> Adding parsing code for memory tunables in the domain xml file
> 
> v2:
> + Fix typo min_guarantee
> 
> Signed-off-by: Nikunj A. Dadhania <nikunj at linux.vnet.ibm.com>
> ---
>  src/conf/domain_conf.c     |   50 +++++++++++++++++++++++++++++++++++++-------
>  src/conf/domain_conf.h     |   12 ++++++++---
>  src/esx/esx_vmx.c          |   30 +++++++++++++-------------
>  src/lxc/lxc_controller.c   |    2 +-
>  src/lxc/lxc_driver.c       |   12 +++++------
>  src/openvz/openvz_driver.c |    8 ++++---
>  src/qemu/qemu_conf.c       |    8 ++++---
>  src/qemu/qemu_driver.c     |   18 ++++++++--------
>  src/test/test_driver.c     |   12 +++++------
>  src/uml/uml_conf.c         |    2 +-
>  src/uml/uml_driver.c       |   14 ++++++------
>  11 files changed, 104 insertions(+), 64 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index e05d5d7..0dd74e4 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -4231,19 +4231,38 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>      def->description = virXPathString("string(./description[1])", ctxt);
> 
>      /* Extract domain memory */
> -    if (virXPathULong("string(./memory[1])", ctxt, &def->maxmem) < 0) {
> +    if (virXPathULong("string(./memory[1])", ctxt, 
> +                      &def->mem.max_balloon) < 0) {
>          virDomainReportError(VIR_ERR_INTERNAL_ERROR,
>                               "%s", _("missing memory element"));
>          goto error;
>      }
> 
> -    if (virXPathULong("string(./currentMemory[1])", ctxt, &def->memory) < 0)
> -        def->memory = def->maxmem;
> +    if (virXPathULong("string(./currentMemory[1])", ctxt, 
> +                      &def->mem.cur_balloon) < 0)
> +        def->mem.cur_balloon = def->mem.max_balloon;
> 
>      node = virXPathNode("./memoryBacking/hugepages", ctxt);
>      if (node)
> -        def->hugepage_backed = 1;
> -
> +        def->mem.hugepage_backed = 1;
> +
> +    /* Extract other memory tunables */
> +    if (virXPathULong("string(./memtune/hard_limit)", ctxt, 
> +                      &def->mem.hard_limit) < 0) 
> +        def->mem.hard_limit = 0;
> +    
> +    if (virXPathULong("string(./memtune/soft_limit[1])", ctxt, 
> +                      &def->mem.soft_limit) < 0)
> +        def->mem.soft_limit = 0;
> +
> +    if (virXPathULong("string(./memtune/min_guarantee[1])", ctxt, 
> +                      &def->mem.min_guarantee) < 0)
> +        def->mem.min_guarantee = 0;
> +
> +    if (virXPathULong("string(./memtune/swap_hard_limit[1])", ctxt, 
> +                      &def->mem.swap_hard_limit) < 0)
> +        def->mem.swap_hard_limit = 0;
> +

Quick question, does 0 represent invalid values? I'd presume you'd
want to use something like -1. We support unsigned long long for the
values to be set (64 bit signed), unlimited translates to 2^63 - 1, is
ULong sufficient to represent that value?
    
>      if (virXPathULong("string(./vcpu[1])", ctxt, &def->vcpus) < 0)
>          def->vcpus = 1;
> 
> @@ -6382,10 +6401,25 @@ char *virDomainDefFormat(virDomainDefPtr def,
>          virBufferEscapeString(&buf, "  <description>%s</description>\n",
>                                def->description);
> 
> -    virBufferVSprintf(&buf, "  <memory>%lu</memory>\n", def->maxmem);
> +    virBufferVSprintf(&buf, "  <memory>%lu</memory>\n", def->mem.max_balloon);
>      virBufferVSprintf(&buf, "  <currentMemory>%lu</currentMemory>\n",
> -                      def->memory);
> -    if (def->hugepage_backed) {
> +                      def->mem.cur_balloon);
> +    virBufferVSprintf(&buf, "  <memtune>\n");
> +    if (def->mem.hard_limit) {
> +        virBufferVSprintf(&buf, "    <hard_limit>%lu</hard_limit>\n", 
> +                          def->mem.hard_limit);
> +    }
> +    if (def->mem.soft_limit) {
> +        virBufferVSprintf(&buf, "    <soft_limit>%lu</soft_limit>\n", 
> +                          def->mem.soft_limit);
> +    }
> +    if (def->mem.swap_hard_limit) {
> +        virBufferVSprintf(&buf, "    <swap_hard_limit>%lu</swap_hard_limit>\n", 
> +                          def->mem.swap_hard_limit);
> +    }
> +    virBufferVSprintf(&buf, "  </memtune>\n");
> +
> +    if (def->mem.hugepage_backed) {
>          virBufferAddLit(&buf, "  <memoryBacking>\n");
>          virBufferAddLit(&buf, "    <hugepages/>\n");
>          virBufferAddLit(&buf, "  </memoryBacking>\n");
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 7195c04..2ecc2af 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -864,9 +864,15 @@ struct _virDomainDef {
>      char *name;
>      char *description;
> 
> -    unsigned long memory;
> -    unsigned long maxmem;
> -    unsigned char hugepage_backed;
> +    struct {
> +        unsigned long max_balloon;
> +        unsigned long cur_balloon;
> +        unsigned long hugepage_backed;
> +        unsigned long hard_limit;
> +        unsigned long soft_limit;
> +        unsigned long min_guarantee;
> +        unsigned long swap_hard_limit;

The hard_limit, soft_limit, swap_hard_limit are s64 and the value is
in bytes. What is the unit supported in this implementation?

> +    } mem;
>      unsigned long vcpus;
>      int cpumasklen;
>      char *cpumask;
> diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c
> index 59eb3b2..6f1eb17 100644
> --- a/src/esx/esx_vmx.c
> +++ b/src/esx/esx_vmx.c
> @@ -48,8 +48,8 @@ domain-xml                        <=>   vmx
>  def->id = <value>                 <=>   ???                                     # not representable
>  def->uuid = <value>               <=>   uuid.bios = "<value>"
>  def->name = <value>               <=>   displayName = "<value>"
> -def->maxmem = <value kilobyte>    <=>   memsize = "<value megabyte>"            # must be a multiple of 4, defaults to 32
> -def->memory = <value kilobyte>    <=>   sched.mem.max = "<value megabyte>"      # defaults to "unlimited" -> def->memory = def->maxmem
> +def->mem.max_balloon = <value kilobyte>    <=>   memsize = "<value megabyte>"            # must be a multiple of 4, defaults to 32
> +def->mem.cur_balloon = <value kilobyte>    <=>   sched.mem.max = "<value megabyte>"      # defaults to "unlimited" -> def->mem.cur_balloon = def->mem.max_balloon
>  def->vcpus = <value>              <=>   numvcpus = "<value>"                    # must be 1 or a multiple of 2, defaults to 1
>  def->cpumask = <uint list>        <=>   sched.cpu.affinity = "<uint list>"
> 
> @@ -979,7 +979,7 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
>          *tmp2 = '\0';
>      }
> 
> -    /* vmx:memsize -> def:maxmem */
> +    /* vmx:memsize -> def:mem.max_balloon */
>      if (esxUtil_GetConfigLong(conf, "memsize", &memsize, 32, true) < 0) {
>          goto cleanup;
>      }
> @@ -991,7 +991,7 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
>          goto cleanup;
>      }
> 
> -    def->maxmem = memsize * 1024; /* Scale from megabytes to kilobytes */
> +    def->mem.max_balloon = memsize * 1024; /* Scale from megabytes to kilobytes */
> 
>      /* vmx:sched.mem.max -> def:memory */
>      if (esxUtil_GetConfigLong(conf, "sched.mem.max", &memory, memsize,
> @@ -1003,10 +1003,10 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
>          memory = memsize;
>      }
> 
> -    def->memory = memory * 1024; /* Scale from megabytes to kilobytes */
> +    def->mem.cur_balloon = memory * 1024; /* Scale from megabytes to kilobytes */
> 
> -    if (def->memory > def->maxmem) {
> -        def->memory = def->maxmem;
> +    if (def->mem.cur_balloon > def->mem.max_balloon) {
> +        def->mem.cur_balloon = def->mem.max_balloon;
>      }
> 
>      /* vmx:numvcpus -> def:vcpus */
> @@ -2469,32 +2469,32 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
>          virBufferVSprintf(&buffer, "annotation = \"%s\"\n", annotation);
>      }
> 
> -    /* def:maxmem -> vmx:memsize */
> -    if (def->maxmem <= 0 || def->maxmem % 4096 != 0) {
> +    /* def:mem.max_balloon -> vmx:memsize */
> +    if (def->mem.max_balloon <= 0 || def->mem.max_balloon % 4096 != 0) {
>          ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
>                    _("Expecting domain XML entry 'memory' to be an unsigned "
>                      "integer (multiple of 4096) but found %lld"),
> -                  (unsigned long long)def->maxmem);
> +                  (unsigned long long)def->mem.max_balloon);
>          goto cleanup;
>      }
> 
>      /* Scale from kilobytes to megabytes */
>      virBufferVSprintf(&buffer, "memsize = \"%d\"\n",
> -                      (int)(def->maxmem / 1024));
> +                      (int)(def->mem.max_balloon / 1024));
> 
>      /* def:memory -> vmx:sched.mem.max */
> -    if (def->memory < def->maxmem) {
> -        if (def->memory <= 0 || def->memory % 1024 != 0) {
> +    if (def->mem.cur_balloon < def->mem.max_balloon) {
> +        if (def->mem.cur_balloon <= 0 || def->mem.cur_balloon % 1024 != 0) {
>              ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
>                        _("Expecting domain XML entry 'currentMemory' to be an "
>                          "unsigned integer (multiple of 1024) but found %lld"),
> -                      (unsigned long long)def->memory);
> +                      (unsigned long long)def->mem.cur_balloon);
>              goto cleanup;
>          }
> 
>          /* Scale from kilobytes to megabytes */
>          virBufferVSprintf(&buffer, "sched.mem.max = \"%d\"\n",
> -                          (int)(def->memory / 1024));
> +                          (int)(def->mem.cur_balloon / 1024));
>      }
> 
>      /* def:vcpus -> vmx:numvcpus */
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index 7dc51a5..82ecce0 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -102,7 +102,7 @@ static int lxcSetContainerResources(virDomainDefPtr def)
>          goto cleanup;
>      }
> 
> -    rc = virCgroupSetMemory(cgroup, def->maxmem);
> +    rc = virCgroupSetMemory(cgroup, def->mem.max_balloon);
>      if (rc != 0) {
>          virReportSystemError(-rc,
>                               _("Unable to set memory limit for domain %s"),
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index a240e6d..8977835 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -500,7 +500,7 @@ static int lxcDomainGetInfo(virDomainPtr dom,
> 
>      if (!virDomainObjIsActive(vm) || driver->cgroup == NULL) {
>          info->cpuTime = 0;
> -        info->memory = vm->def->memory;
> +        info->memory = vm->def->mem.cur_balloon;
>      } else {
>          if (virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 0) != 0) {
>              lxcError(VIR_ERR_INTERNAL_ERROR,
> @@ -520,7 +520,7 @@ static int lxcDomainGetInfo(virDomainPtr dom,
>          }
>      }
> 
> -    info->maxMem = vm->def->maxmem;
> +    info->maxMem = vm->def->mem.max_balloon;
>      info->nrVirtCpu = 1;
>      ret = 0;
> 
> @@ -580,7 +580,7 @@ static unsigned long lxcDomainGetMaxMemory(virDomainPtr dom) {
>          goto cleanup;
>      }
> 
> -    ret = vm->def->maxmem;
> +    ret = vm->def->mem.max_balloon;
> 
>  cleanup:
>      if (vm)
> @@ -605,13 +605,13 @@ static int lxcDomainSetMaxMemory(virDomainPtr dom, unsigned long newmax) {
>          goto cleanup;
>      }
> 
> -    if (newmax < vm->def->memory) {
> +    if (newmax < vm->def->mem.cur_balloon) {
>          lxcError(VIR_ERR_INVALID_ARG,
>                           "%s", _("Cannot set max memory lower than current memory"));
>          goto cleanup;
>      }
> 
> -    vm->def->maxmem = newmax;
> +    vm->def->mem.max_balloon = newmax;
>      ret = 0;
> 
>  cleanup:
> @@ -637,7 +637,7 @@ static int lxcDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
>          goto cleanup;
>      }
> 
> -    if (newmem > vm->def->maxmem) {
> +    if (newmem > vm->def->mem.max_balloon) {
>          lxcError(VIR_ERR_INVALID_ARG,
>                   "%s", _("Cannot set memory higher than max memory"));
>          goto cleanup;
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 4247e0a..92cf4a1 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -403,8 +403,8 @@ static int openvzDomainGetInfo(virDomainPtr dom,
>          }
>      }
> 
> -    info->maxMem = vm->def->maxmem;
> -    info->memory = vm->def->memory;
> +    info->maxMem = vm->def->mem.max_balloon;
> +    info->memory = vm->def->mem.cur_balloon;
>      info->nrVirtCpu = vm->def->vcpus;
>      ret = 0;
> 
> @@ -934,8 +934,8 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
>          }
>      }
> 
> -    if (vm->def->memory > 0) {
> -        if (openvzDomainSetMemoryInternal(vm, vm->def->memory) < 0) {
> +    if (vm->def->mem.cur_balloon > 0) {
> +        if (openvzDomainSetMemoryInternal(vm, vm->def->mem.cur_balloon) < 0) {
>              openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
>                          _("Could not set memory size"));
>               goto cleanup;
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index 7a37c70..731c554 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -3846,7 +3846,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
>       * is set post-startup using the balloon driver. If balloon driver
>       * is not supported, then they're out of luck anyway
>       */
> -    snprintf(memory, sizeof(memory), "%lu", def->maxmem/1024);
> +    snprintf(memory, sizeof(memory), "%lu", def->mem.max_balloon/1024);
>      snprintf(domid, sizeof(domid), "%d", def->id);
> 
>      ADD_ENV_LIT("LC_ALL=C");
> @@ -3892,7 +3892,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
>          ADD_ARG_LIT("-enable-kvm");
>      ADD_ARG_LIT("-m");
>      ADD_ARG_LIT(memory);
> -    if (def->hugepage_backed) {
> +    if (def->mem.hugepage_backed) {
>          if (!driver->hugetlbfs_mount) {
>              qemuReportError(VIR_ERR_INTERNAL_ERROR,
>                              "%s", _("hugetlbfs filesystem is not mounted"));
> @@ -6119,7 +6119,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
>      virUUIDGenerate(def->uuid);
> 
>      def->id = -1;
> -    def->memory = def->maxmem = 64 * 1024;
> +    def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024;
>      def->vcpus = 1;
>      def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
>      def->features = (1 << VIR_DOMAIN_FEATURE_ACPI)
> @@ -6234,7 +6234,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
>                                  _("cannot parse memory level '%s'"), val);
>                  goto error;
>              }
> -            def->memory = def->maxmem = mem * 1024;
> +            def->mem.cur_balloon = def->mem.max_balloon = mem * 1024;
>          } else if (STREQ(arg, "-smp")) {
>              WANT_VALUE();
>              if (qemuParseCommandLineSmp(def, val) < 0)
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f44a18f..bf4373a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -3939,7 +3939,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
> 
>      DEBUG0("Setting initial memory amount");
>      qemuDomainObjEnterMonitorWithDriver(driver, vm);
> -    if (qemuMonitorSetBalloon(priv->mon, vm->def->memory) < 0) {
> +    if (qemuMonitorSetBalloon(priv->mon, vm->def->mem.cur_balloon) < 0) {
>          qemuDomainObjExitMonitorWithDriver(driver, vm);
>          goto cleanup;
>      }
> @@ -4862,7 +4862,7 @@ static unsigned long qemudDomainGetMaxMemory(virDomainPtr dom) {
>          goto cleanup;
>      }
> 
> -    ret = vm->def->maxmem;
> +    ret = vm->def->mem.max_balloon;
> 
>  cleanup:
>      if (vm)
> @@ -4893,7 +4893,7 @@ static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
>          goto cleanup;
>      }
> 
> -    if (newmem > vm->def->maxmem) {
> +    if (newmem > vm->def->mem.max_balloon) {
>          qemuReportError(VIR_ERR_INVALID_ARG,
>                          "%s", _("cannot set memory higher than max memory"));
>          goto cleanup;
> @@ -4957,14 +4957,14 @@ static int qemudDomainGetInfo(virDomainPtr dom,
>          }
>      }
> 
> -    info->maxMem = vm->def->maxmem;
> +    info->maxMem = vm->def->mem.max_balloon;
> 
>      if (virDomainObjIsActive(vm)) {
>          qemuDomainObjPrivatePtr priv = vm->privateData;
> 
>          if ((vm->def->memballoon != NULL) &&
>              (vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE)) {
> -            info->memory = vm->def->maxmem;
> +            info->memory = vm->def->mem.max_balloon;
>          } else if (!priv->jobActive) {
>              if (qemuDomainObjBeginJob(vm) < 0)
>                  goto cleanup;
> @@ -4980,7 +4980,7 @@ static int qemudDomainGetInfo(virDomainPtr dom,
> 
>              if (err == 0)
>                  /* Balloon not supported, so maxmem is always the allocation */
> -                info->memory = vm->def->maxmem;
> +                info->memory = vm->def->mem.max_balloon;
>              else
>                  info->memory = balloon;
> 
> @@ -4989,10 +4989,10 @@ static int qemudDomainGetInfo(virDomainPtr dom,
>                  goto cleanup;
>              }
>          } else {
> -            info->memory = vm->def->memory;
> +            info->memory = vm->def->mem.cur_balloon;
>          }
>      } else {
> -        info->memory = vm->def->memory;
> +        info->memory = vm->def->mem.cur_balloon;
>      }
> 
>      info->nrVirtCpu = vm->def->vcpus;
> @@ -6774,7 +6774,7 @@ static char *qemudDomainDumpXML(virDomainPtr dom,
>              if (err < 0)
>                  goto cleanup;
>              if (err > 0)
> -                vm->def->memory = balloon;
> +                vm->def->mem.cur_balloon = balloon;
>              /* err == 0 indicates no balloon support, so ignore it */
>          }
>      }
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 906211c..7d4d119 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -1681,8 +1681,8 @@ static int testGetDomainInfo (virDomainPtr domain,
>      }
> 
>      info->state = privdom->state;
> -    info->memory = privdom->def->memory;
> -    info->maxMem = privdom->def->maxmem;
> +    info->memory = privdom->def->mem.cur_balloon;
> +    info->maxMem = privdom->def->mem.max_balloon;
>      info->nrVirtCpu = privdom->def->vcpus;
>      info->cpuTime = ((tv.tv_sec * 1000ll * 1000ll  * 1000ll) + (tv.tv_usec * 1000ll));
>      ret = 0;
> @@ -1963,7 +1963,7 @@ static unsigned long testGetMaxMemory(virDomainPtr domain) {
>          goto cleanup;
>      }
> 
> -    ret = privdom->def->maxmem;
> +    ret = privdom->def->mem.max_balloon;
> 
>  cleanup:
>      if (privdom)
> @@ -1989,7 +1989,7 @@ static int testSetMaxMemory(virDomainPtr domain,
>      }
> 
>      /* XXX validate not over host memory wrt to other domains */
> -    privdom->def->maxmem = memory;
> +    privdom->def->mem.max_balloon = memory;
>      ret = 0;
> 
>  cleanup:
> @@ -2015,12 +2015,12 @@ static int testSetMemory(virDomainPtr domain,
>          goto cleanup;
>      }
> 
> -    if (memory > privdom->def->maxmem) {
> +    if (memory > privdom->def->mem.max_balloon) {
>          testError(VIR_ERR_INVALID_ARG, __FUNCTION__);
>          goto cleanup;
>      }
> 
> -    privdom->def->memory = memory;
> +    privdom->def->mem.cur_balloon = memory;
>      ret = 0;
> 
>  cleanup:
> diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
> index f2eaef5..33b2b04 100644
> --- a/src/uml/uml_conf.c
> +++ b/src/uml/uml_conf.c
> @@ -502,7 +502,7 @@ int umlBuildCommandLine(virConnectPtr conn,
>          }                                                               \
>      } while (0)
> 
> -    snprintf(memory, sizeof(memory), "%luK", vm->def->memory);
> +    snprintf(memory, sizeof(memory), "%luK", vm->def->mem.cur_balloon);
> 
>      ADD_ENV_LIT("LC_ALL=C");
> 
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index 1236abb..e195541 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -1420,7 +1420,7 @@ static unsigned long umlDomainGetMaxMemory(virDomainPtr dom) {
>                         _("no domain with matching uuid '%s'"), uuidstr);
>          goto cleanup;
>      }
> -    ret = vm->def->maxmem;
> +    ret = vm->def->mem.max_balloon;
> 
>  cleanup:
>      if (vm)
> @@ -1446,13 +1446,13 @@ static int umlDomainSetMaxMemory(virDomainPtr dom, unsigned long newmax) {
>          goto cleanup;
>      }
> 
> -    if (newmax < vm->def->memory) {
> +    if (newmax < vm->def->mem.cur_balloon) {
>          umlReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("cannot set max memory lower than current memory"));
>          goto cleanup;
>      }
> 
> -    vm->def->maxmem = newmax;
> +    vm->def->mem.max_balloon = newmax;
>      ret = 0;
> 
>  cleanup:
> @@ -1485,13 +1485,13 @@ static int umlDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
>          goto cleanup;
>      }
> 
> -    if (newmem > vm->def->maxmem) {
> +    if (newmem > vm->def->mem.max_balloon) {
>          umlReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("cannot set memory higher than max memory"));
>          goto cleanup;
>      }
> 
> -    vm->def->memory = newmem;
> +    vm->def->mem.cur_balloon = newmem;
>      ret = 0;
> 
>  cleanup:
> @@ -1528,8 +1528,8 @@ static int umlDomainGetInfo(virDomainPtr dom,
>          }
>      }
> 
> -    info->maxMem = vm->def->maxmem;
> -    info->memory = vm->def->memory;
> +    info->maxMem = vm->def->mem.max_balloon;
> +    info->memory = vm->def->mem.cur_balloon;
>      info->nrVirtCpu = vm->def->vcpus;
>      ret = 0;
> 
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
	Three Cheers,
	Balbir




More information about the libvir-list mailing list