]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
xml: use better types for memory values
authorEric Blake <eblake@redhat.com>
Fri, 2 Mar 2012 20:27:39 +0000 (13:27 -0700)
committerEric Blake <eblake@redhat.com>
Thu, 8 Mar 2012 01:24:44 +0000 (18:24 -0700)
Using 'unsigned long' for memory values is risky on 32-bit platforms,
as a PAE guest can have more than 4GiB memory.  Our API is
(unfortunately) locked at 'unsigned long' and a scale of 1024, but
the rest of our system should consistently use 64-bit values,
especially since the previous patch centralized overflow checking.

* src/conf/domain_conf.h (_virDomainDef): Always use 64-bit values
for memory.  Change hugepage_backed to a bool.
* src/conf/domain_conf.c (virDomainDefParseXML)
(virDomainDefCheckABIStability, virDomainDefFormatInternal): Fix
clients.
* src/vmx/vmx.c (virVMXFormatConfig): Likewise.
* src/xenxs/xen_sxpr.c (xenParseSxpr, xenFormatSxpr): Likewise.
* src/xenxs/xen_xm.c (xenXMConfigGetULongLong): New function.
(xenXMConfigGetULong, xenXMConfigSetInt): Avoid truncation.
(xenParseXM, xenFormatXM): Fix clients.
* src/phyp/phyp_driver.c (phypBuildLpar): Likewise.
* src/openvz/openvz_driver.c (openvzDomainSetMemoryInternal):
Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainDefineXML): Likewise.
* src/qemu/qemu_command.c (qemuBuildCommandLine): Likewise.
* src/qemu/qemu_process.c (qemuProcessStart): Likewise.
* src/qemu/qemu_monitor.h (qemuMonitorGetBalloonInfo): Likewise.
* src/qemu/qemu_monitor_text.h (qemuMonitorTextGetBalloonInfo):
Likewise.
* src/qemu/qemu_monitor_text.c (qemuMonitorTextGetBalloonInfo):
Likewise.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONGetBalloonInfo):
Likewise.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONGetBalloonInfo):
Likewise.
* src/qemu/qemu_driver.c (qemudDomainGetInfo)
(qemuDomainGetXMLDesc): Likewise.
* src/uml/uml_conf.c (umlBuildCommandLine): Likewise.

19 files changed:
src/conf/domain_audit.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/openvz/openvz_driver.c
src/phyp/phyp_driver.c
src/qemu/qemu_command.c
src/qemu/qemu_driver.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
src/qemu/qemu_monitor_text.c
src/qemu/qemu_monitor_text.h
src/qemu/qemu_process.c
src/uml/uml_conf.c
src/vbox/vbox_tmpl.c
src/vmx/vmx.c
src/xenxs/xen_sxpr.c
src/xenxs/xen_xm.c

index 934e5469b0396a922f1ae285ead88859e56960d6..b885906462e649fc8ec0fa3aaf354bb074d17114 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * domain_audit.c: Domain audit management
  *
- * Copyright (C) 2006-2011 Red Hat, Inc.
+ * Copyright (C) 2006-2012 Red Hat, Inc.
  * Copyright (C) 2006 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
index 16ab9d40228c81fb72cfaae36deaea81e6c108a2..b1dd00d623eef5170fb61b32bb5af3c3e84ee21f 100644 (file)
@@ -7614,27 +7614,27 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
         goto error;
 
     /* Extract domain memory */
-    if (virXPathULong("string(./memory[1])", ctxt,
-                      &def->mem.max_balloon) < 0) {
+    if (virXPathULongLong("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->mem.cur_balloon) < 0)
+    if (virXPathULongLong("string(./currentMemory[1])", ctxt,
+                          &def->mem.cur_balloon) < 0)
         def->mem.cur_balloon = def->mem.max_balloon;
 
     if (def->mem.cur_balloon > def->mem.max_balloon) {
         virDomainReportError(VIR_ERR_XML_ERROR,
-                             _("current memory '%luk' exceeds maximum '%luk'"),
+                             _("current memory '%lluk' exceeds maximum '%lluk'"),
                              def->mem.cur_balloon, def->mem.max_balloon);
         goto error;
     }
 
     node = virXPathNode("./memoryBacking/hugepages", ctxt);
     if (node)
-        def->mem.hugepage_backed = 1;
+        def->mem.hugepage_backed = true;
 
     /* Extract blkio cgroup tunables */
     if (virXPathUInt("string(./blkiotune/weight)", ctxt,
@@ -7668,20 +7668,20 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
     VIR_FREE(nodes);
 
     /* Extract other memory tunables */
-    if (virXPathULong("string(./memtune/hard_limit)", ctxt,
-                      &def->mem.hard_limit) < 0)
+    if (virXPathULongLong("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)
+    if (virXPathULongLong("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)
+    if (virXPathULongLong("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)
+    if (virXPathULongLong("string(./memtune/swap_hard_limit[1])", ctxt,
+                          &def->mem.swap_hard_limit) < 0)
         def->mem.swap_hard_limit = 0;
 
     n = virXPathULong("string(./vcpu[1])", ctxt, &count);
@@ -9538,19 +9538,19 @@ bool virDomainDefCheckABIStability(virDomainDefPtr src,
 
     if (src->mem.max_balloon != dst->mem.max_balloon) {
         virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                             _("Target domain max memory %ld does not match source %ld"),
+                             _("Target domain max memory %lld does not match source %lld"),
                              dst->mem.max_balloon, src->mem.max_balloon);
         goto cleanup;
     }
     if (src->mem.cur_balloon != dst->mem.cur_balloon) {
         virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                             _("Target domain current memory %ld does not match source %ld"),
+                             _("Target domain current memory %lld does not match source %lld"),
                              dst->mem.cur_balloon, src->mem.cur_balloon);
         goto cleanup;
     }
     if (src->mem.hugepage_backed != dst->mem.hugepage_backed) {
         virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                             _("Target domain huge page backing %ld does not match source %ld"),
+                             _("Target domain huge page backing %d does not match source %d"),
                              dst->mem.hugepage_backed,
                              src->mem.hugepage_backed);
         goto cleanup;
@@ -12033,9 +12033,9 @@ virDomainDefFormatInternal(virDomainDefPtr def,
         xmlIndentTreeOutput = oldIndentTreeOutput;
     }
 
-    virBufferAsprintf(buf, "  <memory unit='KiB'>%lu</memory>\n",
+    virBufferAsprintf(buf, "  <memory unit='KiB'>%llu</memory>\n",
                       def->mem.max_balloon);
-    virBufferAsprintf(buf, "  <currentMemory unit='KiB'>%lu</currentMemory>\n",
+    virBufferAsprintf(buf, "  <currentMemory unit='KiB'>%llu</currentMemory>\n",
                       def->mem.cur_balloon);
 
     /* add blkiotune only if there are any */
@@ -12077,19 +12077,19 @@ virDomainDefFormatInternal(virDomainDefPtr def,
         virBufferAddLit(buf, "  <memtune>\n");
     if (def->mem.hard_limit) {
         virBufferAsprintf(buf, "    <hard_limit unit='KiB'>"
-                          "%lu</hard_limit>\n", def->mem.hard_limit);
+                          "%llu</hard_limit>\n", def->mem.hard_limit);
     }
     if (def->mem.soft_limit) {
         virBufferAsprintf(buf, "    <soft_limit unit='KiB'>"
-                          "%lu</soft_limit>\n", def->mem.soft_limit);
+                          "%llu</soft_limit>\n", def->mem.soft_limit);
     }
     if (def->mem.min_guarantee) {
         virBufferAsprintf(buf, "    <min_guarantee unit='KiB'>"
-                          "%lu</min_guarantee>\n", def->mem.min_guarantee);
+                          "%llu</min_guarantee>\n", def->mem.min_guarantee);
     }
     if (def->mem.swap_hard_limit) {
         virBufferAsprintf(buf, "    <swap_hard_limit unit='KiB'>"
-                          "%lu</swap_hard_limit>\n", def->mem.swap_hard_limit);
+                          "%llu</swap_hard_limit>\n", def->mem.swap_hard_limit);
     }
     if (def->mem.hard_limit || def->mem.soft_limit || def->mem.min_guarantee ||
         def->mem.swap_hard_limit)
index 2beefcbbe1ce5f5a41a1d928655fa5221610b9bd..23c1947822fd24a4913a965c9ec7980d79b7d1bd 100644 (file)
@@ -1496,13 +1496,13 @@ struct _virDomainDef {
     } blkio;
 
     struct {
-        unsigned long max_balloon; /* in kibibytes */
-        unsigned long cur_balloon; /* in kibibytes */
-        unsigned long hugepage_backed;
-        unsigned long hard_limit; /* in kibibytes */
-        unsigned long soft_limit; /* in kibibytes */
-        unsigned long min_guarantee; /* in kibibytes */
-        unsigned long swap_hard_limit; /* in kibibytes */
+        unsigned long long max_balloon; /* in kibibytes */
+        unsigned long long cur_balloon; /* in kibibytes */
+        bool hugepage_backed;
+        unsigned long long hard_limit; /* in kibibytes */
+        unsigned long long soft_limit; /* in kibibytes */
+        unsigned long long min_guarantee; /* in kibibytes */
+        unsigned long long swap_hard_limit; /* in kibibytes */
     } mem;
     unsigned short vcpus;
     unsigned short maxvcpus;
index aef14915f1494b3efc57e4c2afd26de9c0d7ebbd..4e369eae35bd991bdc4ff8390453d6d36478be68 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * openvz_driver.c: core driver methods for managing OpenVZ VEs
  *
- * Copyright (C) 2010-2011 Red Hat, Inc.
+ * Copyright (C) 2010-2012 Red Hat, Inc.
  * Copyright (C) 2006, 2007 Binary Karma
  * Copyright (C) 2006 Shuveb Hussain
  * Copyright (C) 2007 Anoop Joe Cyriac
@@ -70,7 +70,7 @@ static int openvzDomainGetMaxVcpus(virDomainPtr dom);
 static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
                                         unsigned int nvcpus);
 static int openvzDomainSetMemoryInternal(virDomainObjPtr vm,
-                                         unsigned long memory);
+                                         unsigned long long memory);
 static int openvzGetVEStatus(virDomainObjPtr vm, int *status, int *reason);
 
 static void openvzDriverLock(struct openvz_driver *driver)
@@ -1612,7 +1612,7 @@ static int openvzNumDefinedDomains(virConnectPtr conn) {
 
 static int
 openvzDomainSetMemoryInternal(virDomainObjPtr vm,
-                              unsigned long mem)
+                              unsigned long long mem)
 {
     char str_mem[16];
     const char *prog[] = { VZCTL, "--quiet", "set", PROGRAM_SENTINAL,
@@ -1620,7 +1620,7 @@ openvzDomainSetMemoryInternal(virDomainObjPtr vm,
     };
 
     /* memory has to be changed its format from kbyte to byte */
-    snprintf(str_mem, sizeof(str_mem), "%lu", mem * 1024);
+    snprintf(str_mem, sizeof(str_mem), "%llu", mem * 1024);
 
     openvzSetProgramSentinal(prog, vm->def->name);
     if (virRun(prog, NULL) < 0) {
index e08b1b67e6ee6fcbb5f2f749e85f0f991f14e41d..bdf4a7bfd4989b055a27f9b855d0364a2a44a281 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 Red Hat, Inc.
+ * Copyright (C) 2010-2012 Red Hat, Inc.
  * Copyright IBM Corp. 2009
  *
  * phyp_driver.c: ssh layer to access Power Hypervisors
@@ -3608,10 +3608,10 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
     virBufferAddLit(&buf, "mksyscfg");
     if (system_type == HMC)
         virBufferAsprintf(&buf, " -m %s", managed_system);
-    virBufferAsprintf(&buf, " -r lpar -p %s -i min_mem=%d,desired_mem=%d,"
-                      "max_mem=%d,desired_procs=%d,virtual_scsi_adapters=%s",
-                      def->name, (int) def->mem.cur_balloon,
-                      (int) def->mem.cur_balloon, (int) def->mem.max_balloon,
+    virBufferAsprintf(&buf, " -r lpar -p %s -i min_mem=%lld,desired_mem=%lld,"
+                      "max_mem=%lld,desired_procs=%d,virtual_scsi_adapters=%s",
+                      def->name, def->mem.cur_balloon,
+                      def->mem.cur_balloon, def->mem.max_balloon,
                       (int) def->vcpus, def->disks[0]->src);
     ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
 
index 867c4608dd28fd53dfe661e908023838be5aa496..de2d4a1bd16575a3b06a0efd56fa1c231d3ca5b5 100644 (file)
@@ -4032,7 +4032,7 @@ qemuBuildCommandLine(virConnectPtr conn,
      * is not supported, then they're out of luck anyway
      */
     virCommandAddArg(cmd, "-m");
-    virCommandAddArgFormat(cmd, "%lu", VIR_DIV_UP(def->mem.max_balloon, 1024));
+    virCommandAddArgFormat(cmd, "%llu", VIR_DIV_UP(def->mem.max_balloon, 1024));
     if (def->mem.hugepage_backed) {
         if (!driver->hugetlbfs_mount) {
             qemuReportError(VIR_ERR_INTERNAL_ERROR,
index 6546d0b17d81a3f6cb6048d4fa3d2983b34d30c5..7b6e7477aeb6005eb64bdb6c5d6f48696b4f53ac 100644 (file)
@@ -2139,7 +2139,7 @@ static int qemudDomainGetInfo(virDomainPtr dom,
     virDomainObjPtr vm;
     int ret = -1;
     int err;
-    unsigned long balloon;
+    unsigned long long balloon;
 
     qemuDriverLock(driver);
     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
@@ -4416,7 +4416,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom,
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
     char *ret = NULL;
-    unsigned long balloon;
+    unsigned long long balloon;
     int err = 0;
 
     /* Flags checked by virDomainDefFormat */
index 1da73f69d167b01b24083a0b9eb47d352822ee31..78eb492e15e8d150b45134a0e10e825a586a80e7 100644 (file)
@@ -1260,7 +1260,7 @@ int qemuMonitorGetVirtType(qemuMonitorPtr mon,
 
 
 int qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,
-                              unsigned long *currmem)
+                              unsigned long long *currmem)
 {
     int ret;
     VIR_DEBUG("mon=%p", mon);
index b1c956c26d4f6d9953c4eb2e255b7ac24b3bbf45..654d9bd6bab02922f6afca1397860b41d3941e2f 100644 (file)
@@ -234,7 +234,7 @@ int qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
 int qemuMonitorGetVirtType(qemuMonitorPtr mon,
                            int *virtType);
 int qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,
-                              unsigned long *currmem);
+                              unsigned long long *currmem);
 int qemuMonitorGetMemoryStats(qemuMonitorPtr mon,
                               virDomainMemoryStatPtr stats,
                               unsigned int nr_stats);
index dc67b4bcf6d3ac939c6fe784d05aad101991b110..afd744adc8aa400f6a8198381e6bd4a67b8b329d 100644 (file)
@@ -1178,7 +1178,7 @@ cleanup:
  * or -1 on failure
  */
 int qemuMonitorJSONGetBalloonInfo(qemuMonitorPtr mon,
-                                  unsigned long *currmem)
+                                  unsigned long long *currmem)
 {
     int ret;
     virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("query-balloon",
index 0932a2c0e69344b571deb7b53322d9893c26ce9d..04e9d86aa42e68d6f17cab88ddd24bd863922327 100644 (file)
@@ -61,7 +61,7 @@ int qemuMonitorJSONGetCPUInfo(qemuMonitorPtr mon,
 int qemuMonitorJSONGetVirtType(qemuMonitorPtr mon,
                                int *virtType);
 int qemuMonitorJSONGetBalloonInfo(qemuMonitorPtr mon,
-                                  unsigned long *currmem);
+                                  unsigned long long *currmem);
 int qemuMonitorJSONGetMemoryStats(qemuMonitorPtr mon,
                                   virDomainMemoryStatPtr stats,
                                   unsigned int nr_stats);
index a7ebfba2959724e1979e90decbae34374be7e492..30a04165c8e47c3cb646a63e2834c4d0af514a72 100644 (file)
@@ -705,7 +705,7 @@ static int qemuMonitorParseBalloonInfo(char *text,
  * or -1 on failure
  */
 int qemuMonitorTextGetBalloonInfo(qemuMonitorPtr mon,
-                                  unsigned long *currmem)
+                                  unsigned long long *currmem)
 {
     char *reply = NULL;
     int ret = -1;
index 719fc8265d9993029c5e3025054d5347d2e6fd05..4525864d2a501a450320789c386629494e60ba25 100644 (file)
@@ -54,7 +54,7 @@ int qemuMonitorTextGetCPUInfo(qemuMonitorPtr mon,
 int qemuMonitorTextGetVirtType(qemuMonitorPtr mon,
                                int *virtType);
 int qemuMonitorTextGetBalloonInfo(qemuMonitorPtr mon,
-                                  unsigned long *currmem);
+                                  unsigned long long *currmem);
 int qemuMonitorTextGetMemoryStats(qemuMonitorPtr mon,
                                   virDomainMemoryStatPtr stats,
                                   unsigned int nr_stats);
index 7b99814679268163ddff1f265b1129aaf93be392..bea354b87ed8df46640185565293cb44414a39e7 100644 (file)
@@ -3488,6 +3488,12 @@ int qemuProcessStart(virConnectPtr conn,
      * migration completes.  */
     VIR_DEBUG("Setting initial memory amount");
     cur_balloon = vm->def->mem.cur_balloon;
+    if (cur_balloon != vm->def->mem.cur_balloon) {
+        qemuReportError(VIR_ERR_OVERFLOW,
+                        _("unable to set balloon to %lld"),
+                        vm->def->mem.cur_balloon);
+        goto cleanup;
+    }
     qemuDomainObjEnterMonitorWithDriver(driver, vm);
     if (qemuMonitorSetBalloon(priv->mon, cur_balloon) < 0) {
         qemuDomainObjExitMonitorWithDriver(driver, vm);
index 397d33224a14a9c80934859d803224d162f0f6d9..7bd97083c4e4b30e79bbeb7636a0018c37aa2b5b 100644 (file)
@@ -421,7 +421,7 @@ virCommandPtr umlBuildCommandLine(virConnectPtr conn,
     virCommandAddEnvPassCommon(cmd);
 
     //virCommandAddArgPair(cmd, "con0", "fd:0,fd:1");
-    virCommandAddArgFormat(cmd, "mem=%luK", vm->def->mem.cur_balloon);
+    virCommandAddArgFormat(cmd, "mem=%lluK", vm->def->mem.cur_balloon);
     virCommandAddArgPair(cmd, "umid", vm->def->name);
     virCommandAddArgPair(cmd, "uml_dir", driver->monitorDir);
 
index a39b5677b1698d3bf58e4adf18d8b8f62ab035eb..853a599f162a53477d2100aa36f60e6507bd926a 100644 (file)
@@ -8,7 +8,7 @@
  */
 
 /*
- * Copyright (C) 2010-2011 Red Hat, Inc.
+ * Copyright (C) 2010-2012 Red Hat, Inc.
  * Copyright (C) 2008-2009 Sun Microsystems, Inc.
  *
  * This file is part of a free software library; you can redistribute
@@ -5052,7 +5052,7 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
                                       VIR_DIV_UP(def->mem.cur_balloon, 1024));
     if (NS_FAILED(rc)) {
         vboxError(VIR_ERR_INTERNAL_ERROR,
-                  _("could not set the memory size of the domain to: %lu Kb, "
+                  _("could not set the memory size of the domain to: %llu Kb, "
                     "rc=%08x"),
                   def->mem.cur_balloon, (unsigned)rc);
     }
index 75cb6d1910cbf996127ebe44210190c0b786abc0..cc426da665fb3051b74e4f3664fbb3575a732d41 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * vmx.c: VMware VMX parsing/formatting functions
  *
- * Copyright (C) 2010-2011 Red Hat, Inc.
+ * Copyright (C) 2010-2012 Red Hat, Inc.
  * Copyright (C) 2009-2010 Matthias Bolte <matthias.bolte@googlemail.com>
  *
  * This library is free software; you can redistribute it and/or
@@ -2883,7 +2883,7 @@ virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps, virDomainDefPtr def,
     char *preliminaryDisplayName = NULL;
     char *displayName = NULL;
     char *annotation = NULL;
-    unsigned long max_balloon;
+    unsigned long long max_balloon;
     bool scsi_present[4] = { false, false, false, false };
     int scsi_virtualDev[4] = { -1, -1, -1, -1 };
     bool floppy_present[2] = { false, false };
@@ -2978,19 +2978,19 @@ virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps, virDomainDefPtr def,
     /* max-memory must be a multiple of 4096 kilobyte */
     max_balloon = VIR_DIV_UP(def->mem.max_balloon, 4096) * 4096;
 
-    virBufferAsprintf(&buffer, "memsize = \"%lu\"\n",
+    virBufferAsprintf(&buffer, "memsize = \"%llu\"\n",
                       max_balloon / 1024); /* Scale from kilobytes to megabytes */
 
     /* def:mem.cur_balloon -> vmx:sched.mem.max */
     if (def->mem.cur_balloon < max_balloon) {
-        virBufferAsprintf(&buffer, "sched.mem.max = \"%lu\"\n",
+        virBufferAsprintf(&buffer, "sched.mem.max = \"%llu\"\n",
                           VIR_DIV_UP(def->mem.cur_balloon,
                                      1024)); /* Scale from kilobytes to megabytes */
     }
 
     /* def:mem.min_guarantee -> vmx:sched.mem.minsize */
     if (def->mem.min_guarantee > 0) {
-        virBufferAsprintf(&buffer, "sched.mem.minsize = \"%lu\"\n",
+        virBufferAsprintf(&buffer, "sched.mem.minsize = \"%llu\"\n",
                           VIR_DIV_UP(def->mem.min_guarantee,
                                      1024)); /* Scale from kilobytes to megabytes */
     }
index e5df953fb357196db3468c2e9e847e35b6ccbaef..6d76ffeff3bb8a4d0dd16ead7ca8427d05ac1e24 100644 (file)
@@ -1191,10 +1191,8 @@ xenParseSxpr(const struct sexpr *root,
         }
     }
 
-    def->mem.max_balloon = (unsigned long)
-                           (sexpr_u64(root, "domain/maxmem") << 10);
-    def->mem.cur_balloon = (unsigned long)
-                           (sexpr_u64(root, "domain/memory") << 10);
+    def->mem.max_balloon = (sexpr_u64(root, "domain/maxmem") << 10);
+    def->mem.cur_balloon = (sexpr_u64(root, "domain/memory") << 10);
     if (def->mem.cur_balloon > def->mem.max_balloon)
         def->mem.cur_balloon = def->mem.max_balloon;
 
@@ -2203,7 +2201,7 @@ xenFormatSxpr(virConnectPtr conn,
 
     virBufferAddLit(&buf, "(vm ");
     virBufferEscapeSexpr(&buf, "(name '%s')", def->name);
-    virBufferAsprintf(&buf, "(memory %lu)(maxmem %lu)",
+    virBufferAsprintf(&buf, "(memory %llu)(maxmem %llu)",
                       VIR_DIV_UP(def->mem.cur_balloon, 1024),
                       VIR_DIV_UP(def->mem.max_balloon, 1024));
     virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
index 58621684ff57c6ac4eee174c26d16140f174c5ea..7e7921b82fb687c790e665a02f150b936eabf980 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * xen_xm.c: Xen XM parsing functions
  *
+ * Copyright (C) 2006-2007, 2009-2010, 2012 Red Hat, Inc.
  * Copyright (C) 2011 Univention GmbH
- * Copyright (C) 2006-2007, 2009-2010 Red Hat, Inc.
  * Copyright (C) 2006 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -38,7 +38,7 @@
 #include "xen_sxpr.h"
 #include "domain_conf.h"
 
-/* Convenience method to grab a int from the config file object */
+/* Convenience method to grab a long int from the config file object */
 static int xenXMConfigGetBool(virConfPtr conf,
                               const char *name,
                               int *value,
@@ -68,7 +68,7 @@ static int xenXMConfigGetBool(virConfPtr conf,
 static int xenXMConfigGetULong(virConfPtr conf,
                                const char *name,
                                unsigned long *value,
-                               int def) {
+                               unsigned long def) {
     virConfValuePtr val;
 
     *value = 0;
@@ -96,6 +96,38 @@ static int xenXMConfigGetULong(virConfPtr conf,
 }
 
 
+/* Convenience method to grab a int from the config file object */
+static int xenXMConfigGetULongLong(virConfPtr conf,
+                                   const char *name,
+                                   unsigned long long *value,
+                                   unsigned long long def) {
+    virConfValuePtr val;
+
+    *value = 0;
+    if (!(val = virConfGetValue(conf, name))) {
+        *value = def;
+        return 0;
+    }
+
+    if (val->type == VIR_CONF_LONG) {
+        *value = val->l;
+    } else if (val->type == VIR_CONF_STRING) {
+        char *ret;
+        *value = strtoll(val->str, &ret, 10);
+        if (ret == val->str) {
+            XENXS_ERROR(VIR_ERR_INTERNAL_ERROR,
+                       _("config value %s was malformed"), name);
+            return -1;
+        }
+    } else {
+        XENXS_ERROR(VIR_ERR_INTERNAL_ERROR,
+                   _("config value %s was malformed"), name);
+        return -1;
+    }
+    return 0;
+}
+
+
 /* Convenience method to grab a string from the config file object */
 static int xenXMConfigGetString(virConfPtr conf,
                                 const char *name,
@@ -312,12 +344,12 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
             goto cleanup;
     }
 
-    if (xenXMConfigGetULong(conf, "memory", &def->mem.cur_balloon,
-                            MIN_XEN_GUEST_SIZE * 2) < 0)
+    if (xenXMConfigGetULongLong(conf, "memory", &def->mem.cur_balloon,
+                                MIN_XEN_GUEST_SIZE * 2) < 0)
         goto cleanup;
 
-    if (xenXMConfigGetULong(conf, "maxmem", &def->mem.max_balloon,
-                            def->mem.cur_balloon) < 0)
+    if (xenXMConfigGetULongLong(conf, "maxmem", &def->mem.max_balloon,
+                                def->mem.cur_balloon) < 0)
         goto cleanup;
 
     def->mem.cur_balloon *= 1024;
@@ -1103,9 +1135,14 @@ cleanup:
 
 
 static
-int xenXMConfigSetInt(virConfPtr conf, const char *setting, long l) {
+int xenXMConfigSetInt(virConfPtr conf, const char *setting, long long l) {
     virConfValuePtr value = NULL;
 
+    if ((long) l != l) {
+        XENXS_ERROR(VIR_ERR_OVERFLOW, _("failed to store %lld to %s"),
+                    l, setting);
+        return -1;
+    }
     if (VIR_ALLOC(value) < 0) {
         virReportOOMError();
         return -1;
@@ -1470,10 +1507,12 @@ virConfPtr xenFormatXM(virConnectPtr conn,
     if (xenXMConfigSetString(conf, "uuid", uuid) < 0)
         goto no_memory;
 
-    if (xenXMConfigSetInt(conf, "maxmem", VIR_DIV_UP(def->mem.max_balloon, 1024)) < 0)
+    if (xenXMConfigSetInt(conf, "maxmem",
+                          VIR_DIV_UP(def->mem.max_balloon, 1024)) < 0)
         goto no_memory;
 
-    if (xenXMConfigSetInt(conf, "memory", VIR_DIV_UP(def->mem.cur_balloon, 1024)) < 0)
+    if (xenXMConfigSetInt(conf, "memory",
+                          VIR_DIV_UP(def->mem.cur_balloon, 1024)) < 0)
         goto no_memory;
 
     if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)