]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
conf: Replace read access to def->maxvcpus with accessor
authorPeter Krempa <pkrempa@redhat.com>
Mon, 19 Oct 2015 17:21:24 +0000 (19:21 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 9 Dec 2015 13:57:12 +0000 (14:57 +0100)
Finalize the refactor by adding the 'virDomainDefGetVCpusMax' getter and
reusing it accross libvirt.

17 files changed:
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/libxl/libxl_conf.c
src/libxl/libxl_driver.c
src/openvz/openvz_driver.c
src/qemu/qemu_command.c
src/qemu/qemu_driver.c
src/qemu/qemu_process.c
src/test/test_driver.c
src/vbox/vbox_common.c
src/vmx/vmx.c
src/vz/vz_driver.c
src/xen/xm_internal.c
src/xenapi/xenapi_utils.c
src/xenconfig/xen_common.c
src/xenconfig/xen_sxpr.c

index cee5c1c13a78f12d13d00edae5c85dee23c2b56d..f16518b020dafb1595c0df42f0173726521df31d 100644 (file)
@@ -1304,6 +1304,13 @@ virDomainDefHasVcpusOffline(const virDomainDef *def)
 }
 
 
+unsigned int
+virDomainDefGetVcpusMax(const virDomainDef *def)
+{
+    return def->maxvcpus;
+}
+
+
 virDomainDiskDefPtr
 virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt)
 {
@@ -14983,7 +14990,8 @@ virDomainDefParseXML(xmlDocPtr xml,
 
         for (i = 0; i < def->cputune.nvcpusched; i++) {
             if (virDomainThreadSchedParse(nodes[i],
-                                          0, def->maxvcpus - 1,
+                                          0,
+                                          virDomainDefGetVcpusMax(def) - 1,
                                           "vcpus",
                                           &def->cputune.vcpusched[i]) < 0)
                 goto error;
@@ -15060,7 +15068,7 @@ virDomainDefParseXML(xmlDocPtr xml,
             goto error;
 
         if (def->cpu->sockets &&
-            def->maxvcpus >
+            virDomainDefGetVcpusMax(def) >
             def->cpu->sockets * def->cpu->cores * def->cpu->threads) {
             virReportError(VIR_ERR_XML_DETAIL, "%s",
                            _("Maximum CPUs greater than topology limit"));
@@ -15072,14 +15080,14 @@ virDomainDefParseXML(xmlDocPtr xml,
     if (virDomainNumaDefCPUParseXML(def->numa, ctxt) < 0)
         goto error;
 
-    if (virDomainNumaGetCPUCountTotal(def->numa) > def->maxvcpus) {
+    if (virDomainNumaGetCPUCountTotal(def->numa) > virDomainDefGetVcpusMax(def)) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("Number of CPUs in <numa> exceeds the"
                          " <vcpu> count"));
         goto error;
     }
 
-    if (virDomainNumaGetMaxCPUID(def->numa) >= def->maxvcpus) {
+    if (virDomainNumaGetMaxCPUID(def->numa) >= virDomainDefGetVcpusMax(def)) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("CPU IDs in <numa> exceed the <vcpu> count"));
         goto error;
@@ -17556,10 +17564,10 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
                        dst->vcpus, src->vcpus);
         goto error;
     }
-    if (src->maxvcpus != dst->maxvcpus) {
+    if (virDomainDefGetVcpusMax(src) != virDomainDefGetVcpusMax(dst)) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("Target domain vCPU max %d does not match source %d"),
-                       dst->maxvcpus, src->maxvcpus);
+                       virDomainDefGetVcpusMax(dst), virDomainDefGetVcpusMax(src));
         goto error;
     }
 
@@ -21530,7 +21538,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     }
     if (virDomainDefHasVcpusOffline(def))
         virBufferAsprintf(buf, " current='%u'", def->vcpus);
-    virBufferAsprintf(buf, ">%u</vcpu>\n", def->maxvcpus);
+    virBufferAsprintf(buf, ">%u</vcpu>\n", virDomainDefGetVcpusMax(def));
 
     if (def->niothreadids > 0) {
         virBufferAsprintf(buf, "<iothreads>%u</iothreads>\n",
index 89c22e3c2acc47f0e0f411576013454c6f660bd2..cbdb417b9833a91f2c5922c2493dacebc71e7b04 100644 (file)
@@ -2345,6 +2345,7 @@ struct _virDomainDef {
 
 int virDomainDefSetVcpusMax(virDomainDefPtr def, unsigned int vcpus);
 bool virDomainDefHasVcpusOffline(const virDomainDef *def);
+unsigned int virDomainDefGetVcpusMax(const virDomainDef *def);
 
 unsigned long long virDomainDefGetMemoryInitial(const virDomainDef *def);
 void virDomainDefSetMemoryTotal(virDomainDefPtr def, unsigned long long size);
index a8ad00a197b10a534092d1bcb25aa3872c9c5f24..a164798bbfefcf4982f25d9b813a5df0fd84aea5 100644 (file)
@@ -217,6 +217,7 @@ virDomainDefGetDefaultEmulator;
 virDomainDefGetMemoryActual;
 virDomainDefGetMemoryInitial;
 virDomainDefGetSecurityLabelDef;
+virDomainDefGetVcpusMax;
 virDomainDefHasDeviceAddress;
 virDomainDefHasMemoryHotplug;
 virDomainDefHasVcpusOffline;
index 4eed5caf0ee39b16c648a10fd4f39872edb45199..35089ead5b88f22978558a2eb284e4324f454a92 100644 (file)
@@ -643,8 +643,8 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
     else
         libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_PV);
 
-    b_info->max_vcpus = def->maxvcpus;
-    if (libxl_cpu_bitmap_alloc(ctx, &b_info->avail_vcpus, def->maxvcpus))
+    b_info->max_vcpus = virDomainDefGetVcpusMax(def);
+    if (libxl_cpu_bitmap_alloc(ctx, &b_info->avail_vcpus, b_info->max_vcpus))
         return -1;
     libxl_bitmap_set_none(&b_info->avail_vcpus);
     for (i = 0; i < def->vcpus; i++)
index f65cfb221a2def7cdd1c27b17149f70f158b38c6..77d290afc1db0c2636b49e5f66fe171b763d10f8 100644 (file)
@@ -2159,8 +2159,8 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
         goto endjob;
     }
 
-    if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM) && vm->def->maxvcpus < max)
-        max = vm->def->maxvcpus;
+    if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM) && virDomainDefGetVcpusMax(vm->def) < max)
+        max = virDomainDefGetVcpusMax(vm->def);
 
     if (nvcpus > max) {
         virReportError(VIR_ERR_INVALID_ARG,
@@ -2297,7 +2297,10 @@ libxlDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
         def = vm->newDef ? vm->newDef : vm->def;
     }
 
-    ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
+    if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
+        ret = virDomainDefGetVcpusMax(def);
+    else
+        ret = def->vcpus;
 
  cleanup:
     if (vm)
@@ -4699,7 +4702,7 @@ libxlDomainGetPerCPUStats(libxlDriverPrivatePtr driver,
     if (nparams == 0 && ncpus != 0)
         return LIBXL_NB_TOTAL_CPU_STAT_PARAM;
     else if (nparams == 0)
-        return vm->def->maxvcpus;
+        return virDomainDefGetVcpusMax(vm->def);
 
     cfg = libxlDriverConfigGet(driver);
     if ((vcpuinfo = libxl_list_vcpu(cfg->ctx, vm->def->id, &maxcpu,
index 56569d179108733204aa399ed02a7aa29366bb81..5e55033fde609959a90da774ab91e5b7ca373b25 100644 (file)
@@ -1035,8 +1035,8 @@ openvzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int fla
                        _("current vcpu count must equal maximum"));
         goto cleanup;
     }
-    if (vm->def->maxvcpus > 0) {
-        if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
+    if (virDomainDefGetVcpusMax(vm->def)) {
+        if (openvzDomainSetVcpusInternal(vm, virDomainDefGetVcpusMax(vm->def)) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("Could not set number of vCPUs"));
              goto cleanup;
@@ -1133,8 +1133,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
     vm->def->id = vm->pid;
     virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
 
-    if (vm->def->maxvcpus > 0) {
-        if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
+    if (virDomainDefGetVcpusMax(vm->def) > 0) {
+        if (openvzDomainSetVcpusInternal(vm, virDomainDefGetVcpusMax(vm->def)) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("Could not set number of vCPUs"));
             goto cleanup;
index aca5221bfd7bbfb089fdd5e677e7718cd363fb18..837f94578be203e2b793ad6447ec8ecadbedcf25 100644 (file)
@@ -7963,7 +7963,7 @@ qemuBuildSmpArgStr(const virDomainDef *def,
 
     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SMP_TOPOLOGY)) {
         if (virDomainDefHasVcpusOffline(def))
-            virBufferAsprintf(&buf, ",maxcpus=%u", def->maxvcpus);
+            virBufferAsprintf(&buf, ",maxcpus=%u", virDomainDefGetVcpusMax(def));
         /* sockets, cores, and threads are either all zero
          * or all non-zero, thus checking one of them is enough */
         if (def->cpu && def->cpu->sockets) {
@@ -7971,7 +7971,7 @@ qemuBuildSmpArgStr(const virDomainDef *def,
             virBufferAsprintf(&buf, ",cores=%u", def->cpu->cores);
             virBufferAsprintf(&buf, ",threads=%u", def->cpu->threads);
         } else {
-            virBufferAsprintf(&buf, ",sockets=%u", def->maxvcpus);
+            virBufferAsprintf(&buf, ",sockets=%u", virDomainDefGetVcpusMax(def));
             virBufferAsprintf(&buf, ",cores=%u", 1);
             virBufferAsprintf(&buf, ",threads=%u", 1);
         }
index 6b59687f714dd71918addbc287761848778be96f..601344307100f6707953cd3eac897340d9633fff 100644 (file)
@@ -4911,10 +4911,10 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
     }
 
     if (def)
-        maxvcpus = def->maxvcpus;
+        maxvcpus = virDomainDefGetVcpusMax(def);
     if (persistentDef) {
-        if (!maxvcpus || maxvcpus > persistentDef->maxvcpus)
-            maxvcpus = persistentDef->maxvcpus;
+        if (!maxvcpus || maxvcpus > virDomainDefGetVcpusMax(persistentDef))
+            maxvcpus = virDomainDefGetVcpusMax(persistentDef);
     }
     if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM) && nvcpus > maxvcpus) {
         virReportError(VIR_ERR_INVALID_ARG,
@@ -5557,7 +5557,7 @@ qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
         }
     } else {
         if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
-            ret = def->maxvcpus;
+            ret = virDomainDefGetVcpusMax(def);
         else
             ret = def->vcpus;
     }
@@ -19078,7 +19078,7 @@ qemuDomainGetStatsVcpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
                               &record->nparams,
                               maxparams,
                               "vcpu.maximum",
-                              (unsigned) dom->def->maxvcpus) < 0)
+                              virDomainDefGetVcpusMax(dom->def)) < 0)
         return -1;
 
     if (VIR_ALLOC_N(cpuinfo, dom->def->vcpus) < 0)
index 420196264685451408c026376d3ed202e07314d8..992260c3c9776db7e1cc1512b28b18a436474b55 100644 (file)
@@ -3869,7 +3869,7 @@ qemuValidateCpuMax(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
     if (!maxCpus)
         return true;
 
-    if (def->maxvcpus > maxCpus) {
+    if (virDomainDefGetVcpusMax(def) > maxCpus) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        "%s", _("Maximum CPUs greater than specified machine type limit"));
         return false;
index d4d8e56840fd768a7bd6179ef56e903a70122e80..cb6ad7634fd30a8ff32c96f77f3180dcf27a0efa 100644 (file)
@@ -2313,7 +2313,10 @@ testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
     if (!(def = virDomainObjGetOneDef(vm, flags)))
         goto cleanup;
 
-    ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
+    if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
+        ret = virDomainDefGetVcpusMax(def);
+    else
+        ret = def->vcpus;
 
  cleanup:
     virDomainObjEndAPI(&vm);
@@ -2356,19 +2359,19 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
     if (virDomainObjGetDefs(privdom, flags, &def, &persistentDef) < 0)
         goto cleanup;
 
-    if (def && def->maxvcpus < nrCpus) {
+    if (def && virDomainDefGetVcpusMax(def) < nrCpus) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("requested cpu amount exceeds maximum (%d > %d)"),
-                       nrCpus, def->maxvcpus);
+                       nrCpus, virDomainDefGetVcpusMax(def));
         goto cleanup;
     }
 
     if (persistentDef &&
         !(flags & VIR_DOMAIN_VCPU_MAXIMUM) &&
-        persistentDef->maxvcpus < nrCpus) {
+        virDomainDefGetVcpusMax(persistentDef) < nrCpus) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("requested cpu amount exceeds maximum (%d > %d)"),
-                       nrCpus, persistentDef->maxvcpus);
+                       nrCpus, virDomainDefGetVcpusMax(persistentDef));
         goto cleanup;
     }
 
index b9aa085723fb30d67d5e03e53575965d2539c48a..61f6476a330ec584ec79566597fc9f26616c30fc 100644 (file)
@@ -1899,11 +1899,11 @@ vboxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("current vcpu count must equal maximum"));
     }
-    rc = gVBoxAPI.UIMachine.SetCPUCount(machine, def->maxvcpus);
+    rc = gVBoxAPI.UIMachine.SetCPUCount(machine, virDomainDefGetVcpusMax(def));
     if (NS_FAILED(rc)) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("could not set the number of virtual CPUs to: %u, rc=%08x"),
-                       def->maxvcpus, (unsigned)rc);
+                       virDomainDefGetVcpusMax(def), (unsigned)rc);
     }
 
     rc = gVBoxAPI.UIMachine.SetCPUProperty(machine, CPUPropertyType_PAE,
index 54024e4d4bf9bb07066a5d46f75cece4c8227798..74b04e2d0bf17432e1b585ec7804bc8edec7c8b2 100644 (file)
@@ -3071,6 +3071,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
     bool scsi_present[4] = { false, false, false, false };
     int scsi_virtualDev[4] = { -1, -1, -1, -1 };
     bool floppy_present[2] = { false, false };
+    unsigned int maxvcpus;
 
     if (ctx->formatFileName == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -3186,15 +3187,16 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
                          "'current'"));
         goto cleanup;
     }
-    if (def->maxvcpus <= 0 || (def->maxvcpus % 2 != 0 && def->maxvcpus != 1)) {
+    maxvcpus = virDomainDefGetVcpusMax(def);
+    if (maxvcpus == 0 || (maxvcpus % 2 != 0 && maxvcpus != 1)) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Expecting domain XML entry 'vcpu' to be an unsigned "
-                         "integer (1 or a multiple of 2) but found %d"),
-                       def->maxvcpus);
+                       _("Expecting domain XML entry 'vcpu' to be 1 or a "
+                         "multiple of 2 but found %d"),
+                       maxvcpus);
         goto cleanup;
     }
 
-    virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n", def->maxvcpus);
+    virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n", maxvcpus);
 
     /* def:cpumask -> vmx:sched.cpu.affinity */
     if (def->cpumask && virBitmapSize(def->cpumask) > 0) {
@@ -3207,11 +3209,11 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
         while ((bit = virBitmapNextSetBit(def->cpumask, bit)) >= 0)
             ++sched_cpu_affinity_length;
 
-        if (sched_cpu_affinity_length < def->maxvcpus) {
+        if (sched_cpu_affinity_length < maxvcpus) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Expecting domain XML attribute 'cpuset' of entry "
                              "'vcpu' to contain at least %d CPU(s)"),
-                           def->maxvcpus);
+                           maxvcpus);
             goto cleanup;
         }
 
index ea1090a340d2fae68a7df9bb4757d7641843565a..994720cecd81da011524965d99c18e65fbb49733 100644 (file)
@@ -1372,7 +1372,7 @@ vzDomainGetVcpusFlags(virDomainPtr dom,
         goto cleanup;
 
     if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
-        ret = privdom->def->maxvcpus;
+        ret = virDomainDefGetVcpusMax(privdom->def);
     else
         ret = privdom->def->vcpus;
 
index c324fdc2c4a67f48c7707c881abda31ddf05007f..f9191acb75e7c10202b11b525fe09465bd054bb5 100644 (file)
@@ -695,7 +695,8 @@ xenXMDomainSetVcpusFlags(virConnectPtr conn,
     /* Can't specify a current larger than stored maximum; but
      * reducing maximum can silently reduce current.  */
     if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM))
-        max = entry->def->maxvcpus;
+        max = virDomainDefGetVcpusMax(entry->def);
+
     if (vcpus > max) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("requested vcpus is greater than max allowable"
@@ -760,8 +761,10 @@ xenXMDomainGetVcpusFlags(virConnectPtr conn,
     if (!(entry = virHashLookup(priv->configCache, filename)))
         goto cleanup;
 
-    ret = ((flags & VIR_DOMAIN_VCPU_MAXIMUM) ? entry->def->maxvcpus
-           : entry->def->vcpus);
+    if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
+        ret = virDomainDefGetVcpusMax(entry->def);
+    else
+        ret = entry->def->vcpus;
 
  cleanup:
     xenUnifiedUnlock(priv);
index a80e084ea19f8aae8d78c6ac5c8d8b737a3c1f22..7ceb56a59eca407dca534255980b3b676f4aeb6d 100644 (file)
@@ -504,8 +504,8 @@ createVMRecordFromXml(virConnectPtr conn, virDomainDefPtr def,
     else
         (*record)->memory_dynamic_max = (*record)->memory_static_max;
 
-    if (def->maxvcpus) {
-        (*record)->vcpus_max = (int64_t) def->maxvcpus;
+    if (virDomainDefGetVcpusMax(def) > 0) {
+        (*record)->vcpus_max = (int64_t) virDomainDefGetVcpusMax(def);
         (*record)->vcpus_at_startup = (int64_t) def->vcpus;
     }
     if (def->onPoweroff)
index c3640e1a419ac548e99ff7b1f53b9fdf1b9c945b..39c8a795e17169b199baf9e6ae2bf37bc413d764 100644 (file)
@@ -508,7 +508,7 @@ xenParseCPUFeatures(virConfPtr conf, virDomainDefPtr def)
     if (xenConfigGetULong(conf, "vcpu_avail", &count, -1) < 0)
         return -1;
 
-    def->vcpus = MIN(count_one_bits_l(count), def->maxvcpus);
+    def->vcpus = MIN(count_one_bits_l(count), virDomainDefGetVcpusMax(def));
     if (xenConfigGetString(conf, "cpus", &str, NULL) < 0)
         return -1;
 
@@ -1528,7 +1528,7 @@ xenFormatCPUAllocation(virConfPtr conf, virDomainDefPtr def)
     int ret = -1;
     char *cpus = NULL;
 
-    if (xenConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
+    if (xenConfigSetInt(conf, "vcpus", virDomainDefGetVcpusMax(def)) < 0)
         goto cleanup;
 
     /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
index 0acc5209fef36d27bf00ebcd2c024f18117609b1..b251525a1e25fadd012b417b3fe22e8db343ff5a 100644 (file)
@@ -1176,8 +1176,8 @@ xenParseSxpr(const struct sexpr *root,
     if (virDomainDefSetVcpusMax(def, sexpr_int(root, "domain/vcpus")) < 0)
         goto error;
     def->vcpus = count_one_bits_l(sexpr_u64(root, "domain/vcpu_avail"));
-    if (!def->vcpus || def->maxvcpus < def->vcpus)
-        def->vcpus = def->maxvcpus;
+    if (!def->vcpus || virDomainDefGetVcpusMax(def) < def->vcpus)
+        def->vcpus = virDomainDefGetVcpusMax(def);
 
     tmp = sexpr_node(root, "domain/on_poweroff");
     if (tmp != NULL) {
@@ -2237,7 +2237,7 @@ xenFormatSxpr(virConnectPtr conn,
     virBufferAsprintf(&buf, "(memory %llu)(maxmem %llu)",
                       VIR_DIV_UP(def->mem.cur_balloon, 1024),
                       VIR_DIV_UP(virDomainDefGetMemoryActual(def), 1024));
-    virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
+    virBufferAsprintf(&buf, "(vcpus %u)", virDomainDefGetVcpusMax(def));
     /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
        either 32, or 64 on a platform where long is big enough.  */
     if (virDomainDefHasVcpusOffline(def))
@@ -2321,7 +2321,7 @@ xenFormatSxpr(virConnectPtr conn,
             else
                 virBufferEscapeSexpr(&buf, "(kernel '%s')", def->os.loader->path);
 
-            virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
+            virBufferAsprintf(&buf, "(vcpus %u)", virDomainDefGetVcpusMax(def));
             if (virDomainDefHasVcpusOffline(def))
                 virBufferAsprintf(&buf, "(vcpu_avail %lu)",
                                   (1UL << def->vcpus) - 1);