vcpu: support maxvcpu in domain_conf

Although this patch adds a distinction between maximum vcpus and
current vcpus in the XML, the values should be identical for all
drivers at this point.  Only in subsequent per-driver patches will
a distinction be made.

In general, virDomainGetInfo should prefer the current vcpus.

* src/conf/domain_conf.h (_virDomainDef): Adjust vcpus to unsigned
short, to match virDomainGetInfo limit.  Add maxvcpus member.
* src/conf/domain_conf.c (virDomainDefParseXML)
(virDomainDefFormat): parse and print out vcpu details.
* src/xen/xend_internal.c (xenDaemonParseSxpr)
(xenDaemonFormatSxpr): Manage both vcpu numbers, and require them
to be equal for now.
* src/xen/xm_internal.c (xenXMDomainConfigParse)
(xenXMDomainConfigFormat): Likewise.
* src/phyp/phyp_driver.c (phypDomainDumpXML): Likewise.
* src/openvz/openvz_conf.c (openvzLoadDomains): Likewise.
* src/openvz/openvz_driver.c (openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainSetVcpusInternal): Likewise.
* src/vbox/vbox_tmpl.c (vboxDomainDumpXML, vboxDomainDefineXML):
Likewise.
* src/xenapi/xenapi_driver.c (xenapiDomainDumpXML): Likewise.
* src/xenapi/xenapi_utils.c (createVMRecordFromXml): Likewise.
* src/esx/esx_vmx.c (esxVMX_ParseConfig, esxVMX_FormatConfig):
Likewise.
* src/qemu/qemu_conf.c (qemuBuildSmpArgStr)
(qemuParseCommandLineSmp, qemuParseCommandLine): Likewise.
* src/qemu/qemu_driver.c (qemudDomainHotplugVcpus): Likewise.
* src/opennebula/one_conf.c (xmlOneTemplate): Likewise.
This commit is contained in:
Eric Blake 2010-09-29 10:20:07 -06:00
parent 50c51f13e2
commit 4617eedfae
14 changed files with 114 additions and 48 deletions

View File

@ -4203,6 +4203,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
int i, n; int i, n;
long id = -1; long id = -1;
virDomainDefPtr def; virDomainDefPtr def;
unsigned long count;
if (VIR_ALLOC(def) < 0) { if (VIR_ALLOC(def) < 0) {
virReportOOMError(); virReportOOMError();
@ -4287,8 +4288,37 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
&def->mem.swap_hard_limit) < 0) &def->mem.swap_hard_limit) < 0)
def->mem.swap_hard_limit = 0; def->mem.swap_hard_limit = 0;
if (virXPathULong("string(./vcpu[1])", ctxt, &def->vcpus) < 0) n = virXPathULong("string(./vcpu[1])", ctxt, &count);
def->vcpus = 1; if (n == -2) {
virDomainReportError(VIR_ERR_XML_ERROR, "%s",
_("maximum vcpus must be an integer"));
goto error;
} else if (n < 0) {
def->maxvcpus = 1;
} else {
def->maxvcpus = count;
if (def->maxvcpus != count || count == 0) {
virDomainReportError(VIR_ERR_XML_ERROR,
_("invalid maxvcpus %lu"), count);
goto error;
}
}
n = virXPathULong("string(./vcpu[1]/@current)", ctxt, &count);
if (n == -2) {
virDomainReportError(VIR_ERR_XML_ERROR, "%s",
_("current vcpus must be an integer"));
goto error;
} else if (n < 0) {
def->vcpus = def->maxvcpus;
} else {
def->vcpus = count;
if (def->vcpus != count || count == 0 || def->maxvcpus < count) {
virDomainReportError(VIR_ERR_XML_ERROR,
_("invalid current vcpus %lu"), count);
goto error;
}
}
tmp = virXPathString("string(./vcpu[1]/@cpuset)", ctxt); tmp = virXPathString("string(./vcpu[1]/@cpuset)", ctxt);
if (tmp) { if (tmp) {
@ -6462,17 +6492,18 @@ char *virDomainDefFormat(virDomainDefPtr def,
if (def->cpumask[n] != 1) if (def->cpumask[n] != 1)
allones = 0; allones = 0;
if (allones) { virBufferAddLit(&buf, " <vcpu");
virBufferVSprintf(&buf, " <vcpu>%lu</vcpu>\n", def->vcpus); if (!allones) {
} else {
char *cpumask = NULL; char *cpumask = NULL;
if ((cpumask = if ((cpumask =
virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL) virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL)
goto cleanup; goto cleanup;
virBufferVSprintf(&buf, " <vcpu cpuset='%s'>%lu</vcpu>\n", virBufferVSprintf(&buf, " cpuset='%s'", cpumask);
cpumask, def->vcpus);
VIR_FREE(cpumask); VIR_FREE(cpumask);
} }
if (def->vcpus != def->maxvcpus)
virBufferVSprintf(&buf, " current='%u'", def->vcpus);
virBufferVSprintf(&buf, ">%u</vcpu>\n", def->maxvcpus);
if (def->os.bootloader) { if (def->os.bootloader) {
virBufferEscapeString(&buf, " <bootloader>%s</bootloader>\n", virBufferEscapeString(&buf, " <bootloader>%s</bootloader>\n",

View File

@ -885,7 +885,8 @@ struct _virDomainDef {
unsigned long min_guarantee; unsigned long min_guarantee;
unsigned long swap_hard_limit; unsigned long swap_hard_limit;
} mem; } mem;
unsigned long vcpus; unsigned short vcpus;
unsigned short maxvcpus;
int cpumasklen; int cpumasklen;
char *cpumask; char *cpumask;

View File

@ -50,7 +50,7 @@ def->uuid = <value> <=> uuid.bios = "<value>"
def->name = <value> <=> displayName = "<value>" def->name = <value> <=> displayName = "<value>"
def->mem.max_balloon = <value kilobyte> <=> memsize = "<value megabyte>" # must be a multiple of 4, defaults to 32 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->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->maxvcpus = <value> <=> numvcpus = "<value>" # must be 1 or a multiple of 2, defaults to 1
def->cpumask = <uint list> <=> sched.cpu.affinity = "<uint list>" def->cpumask = <uint list> <=> sched.cpu.affinity = "<uint list>"
@ -1075,7 +1075,7 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
goto cleanup; goto cleanup;
} }
def->vcpus = numvcpus; def->maxvcpus = def->vcpus = numvcpus;
/* vmx:sched.cpu.affinity -> def:cpumask */ /* vmx:sched.cpu.affinity -> def:cpumask */
// VirtualMachine:config.cpuAffinity.affinitySet // VirtualMachine:config.cpuAffinity.affinitySet
@ -2609,16 +2609,22 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
(int)(def->mem.cur_balloon / 1024)); (int)(def->mem.cur_balloon / 1024));
} }
/* def:vcpus -> vmx:numvcpus */ /* def:maxvcpus -> vmx:numvcpus */
if (def->vcpus <= 0 || (def->vcpus % 2 != 0 && def->vcpus != 1)) { if (def->vcpus != def->maxvcpus) {
ESX_ERROR(VIR_ERR_CONFIG_UNSUPPORTED,
_("No support for domain XML entry 'vcpu' attribute "
"'current'"));
goto cleanup;
}
if (def->maxvcpus <= 0 || (def->maxvcpus % 2 != 0 && def->maxvcpus != 1)) {
ESX_ERROR(VIR_ERR_INTERNAL_ERROR, ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
_("Expecting domain XML entry 'vcpu' to be an unsigned " _("Expecting domain XML entry 'vcpu' to be an unsigned "
"integer (1 or a multiple of 2) but found %d"), "integer (1 or a multiple of 2) but found %d"),
(int)def->vcpus); def->maxvcpus);
goto cleanup; goto cleanup;
} }
virBufferVSprintf(&buffer, "numvcpus = \"%d\"\n", (int)def->vcpus); virBufferVSprintf(&buffer, "numvcpus = \"%d\"\n", def->maxvcpus);
/* def:cpumask -> vmx:sched.cpu.affinity */ /* def:cpumask -> vmx:sched.cpu.affinity */
if (def->cpumasklen > 0) { if (def->cpumasklen > 0) {
@ -2632,11 +2638,11 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
} }
} }
if (sched_cpu_affinity_length < def->vcpus) { if (sched_cpu_affinity_length < def->maxvcpus) {
ESX_ERROR(VIR_ERR_INTERNAL_ERROR, ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
_("Expecting domain XML attribute 'cpuset' of entry " _("Expecting domain XML attribute 'cpuset' of entry "
"'vcpu' to contains at least %d CPU(s)"), "'vcpu' to contain at least %d CPU(s)"),
(int)def->vcpus); def->maxvcpus);
goto cleanup; goto cleanup;
} }

View File

@ -1,5 +1,7 @@
/*----------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------*/
/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad /*
* Copyright (C) 2010 Red Hat, Inc.
* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad
* Complutense de Madrid (dsa-research.org) * Complutense de Madrid (dsa-research.org)
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -169,9 +171,10 @@ char* xmlOneTemplate(virDomainDefPtr def)
{ {
int i; int i;
virBuffer buf= VIR_BUFFER_INITIALIZER; virBuffer buf= VIR_BUFFER_INITIALIZER;
virBufferVSprintf(&buf,"#OpenNebula Template automatically generated by libvirt\nNAME = %s\nCPU = %ld\nMEMORY = %ld\n", virBufferVSprintf(&buf,"#OpenNebula Template automatically generated "
"by libvirt\nNAME = %s\nCPU = %d\nMEMORY = %ld\n",
def->name, def->name,
def->vcpus, def->maxvcpus,
(def->mem.max_balloon)/1024); (def->mem.max_balloon)/1024);
/*Optional Booting OpenNebula Information:*/ /*Optional Booting OpenNebula Information:*/

View File

@ -507,11 +507,12 @@ int openvzLoadDomains(struct openvz_driver *driver) {
veid); veid);
goto cleanup; goto cleanup;
} else if (ret > 0) { } else if (ret > 0) {
dom->def->vcpus = strtoI(temp); dom->def->maxvcpus = strtoI(temp);
} }
if (ret == 0 || dom->def->vcpus == 0) if (ret == 0 || dom->def->maxvcpus == 0)
dom->def->vcpus = openvzGetNodeCPUs(); dom->def->maxvcpus = openvzGetNodeCPUs();
dom->def->vcpus = dom->def->maxvcpus;
/* XXX load rest of VM config data .... */ /* XXX load rest of VM config data .... */

View File

@ -925,8 +925,13 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
if (openvzDomainSetNetworkConfig(conn, vm->def) < 0) if (openvzDomainSetNetworkConfig(conn, vm->def) < 0)
goto cleanup; goto cleanup;
if (vm->def->vcpus > 0) { if (vm->def->vcpus != vm->def->maxvcpus) {
if (openvzDomainSetVcpusInternal(vm, vm->def->vcpus) < 0) { openvzError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("current vcpu count must equal maximum"));
goto cleanup;
}
if (vm->def->maxvcpus > 0) {
if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
openvzError(VIR_ERR_INTERNAL_ERROR, "%s", openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not set number of virtual cpu")); _("Could not set number of virtual cpu"));
goto cleanup; goto cleanup;
@ -1019,8 +1024,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
vm->def->id = vm->pid; vm->def->id = vm->pid;
vm->state = VIR_DOMAIN_RUNNING; vm->state = VIR_DOMAIN_RUNNING;
if (vm->def->vcpus > 0) { if (vm->def->maxvcpus > 0) {
if (openvzDomainSetVcpusInternal(vm, vm->def->vcpus) < 0) { if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
openvzError(VIR_ERR_INTERNAL_ERROR, "%s", openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not set number of virtual cpu")); _("Could not set number of virtual cpu"));
goto cleanup; goto cleanup;
@ -1249,7 +1254,7 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
return -1; return -1;
} }
vm->def->vcpus = nvcpus; vm->def->maxvcpus = vm->def->vcpus = nvcpus;
return 0; return 0;
} }

View File

@ -3540,7 +3540,7 @@ phypDomainDumpXML(virDomainPtr dom, int flags)
goto err; goto err;
} }
if ((def.vcpus = if ((def.maxvcpus = def.vcpus =
phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0) { phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0) {
VIR_ERROR0(_("Unable to determine domain's CPU.")); VIR_ERROR0(_("Unable to determine domain's CPU."));
goto err; goto err;

View File

@ -3711,7 +3711,7 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
{ {
virBuffer buf = VIR_BUFFER_INITIALIZER; virBuffer buf = VIR_BUFFER_INITIALIZER;
virBufferVSprintf(&buf, "%lu", def->vcpus); virBufferVSprintf(&buf, "%u", def->vcpus);
if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) { if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) {
/* sockets, cores, and threads are either all zero /* sockets, cores, and threads are either all zero
@ -3722,11 +3722,18 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
virBufferVSprintf(&buf, ",threads=%u", def->cpu->threads); virBufferVSprintf(&buf, ",threads=%u", def->cpu->threads);
} }
else { else {
virBufferVSprintf(&buf, ",sockets=%lu", def->vcpus); virBufferVSprintf(&buf, ",sockets=%u", def->maxvcpus);
virBufferVSprintf(&buf, ",cores=%u", 1); virBufferVSprintf(&buf, ",cores=%u", 1);
virBufferVSprintf(&buf, ",threads=%u", 1); virBufferVSprintf(&buf, ",threads=%u", 1);
} }
} }
if (def->vcpus != def->maxvcpus) {
virBufferFreeAndReset(&buf);
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("setting current vcpu count less than maximum is "
"not supported yet"));
return NULL;
}
if (virBufferError(&buf)) { if (virBufferError(&buf)) {
virBufferFreeAndReset(&buf); virBufferFreeAndReset(&buf);
@ -6178,6 +6185,8 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
} }
} }
dom->maxvcpus = dom->vcpus;
if (sockets && cores && threads) { if (sockets && cores && threads) {
virCPUDefPtr cpu; virCPUDefPtr cpu;
@ -6247,6 +6256,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
def->id = -1; def->id = -1;
def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024; def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024;
def->maxvcpus = 1;
def->vcpus = 1; def->vcpus = 1;
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC; def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
def->features = (1 << VIR_DOMAIN_FEATURE_ACPI) def->features = (1 << VIR_DOMAIN_FEATURE_ACPI)

View File

@ -2425,8 +2425,9 @@ qemuDetectVcpuPIDs(struct qemud_driver *driver,
if (ncpupids != vm->def->vcpus) { if (ncpupids != vm->def->vcpus) {
qemuReportError(VIR_ERR_INTERNAL_ERROR, qemuReportError(VIR_ERR_INTERNAL_ERROR,
_("got wrong number of vCPU pids from QEMU monitor. got %d, wanted %d"), _("got wrong number of vCPU pids from QEMU monitor. "
ncpupids, (int)vm->def->vcpus); "got %d, wanted %d"),
ncpupids, vm->def->vcpus);
VIR_FREE(cpupids); VIR_FREE(cpupids);
return -1; return -1;
} }

View File

@ -2028,7 +2028,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
def->mem.max_balloon = memorySize * 1024; def->mem.max_balloon = memorySize * 1024;
machine->vtbl->GetCPUCount(machine, &CPUCount); machine->vtbl->GetCPUCount(machine, &CPUCount);
def->vcpus = CPUCount; def->maxvcpus = def->vcpus = CPUCount;
/* Skip cpumasklen, cpumask, onReboot, onPoweroff, onCrash */ /* Skip cpumasklen, cpumask, onReboot, onPoweroff, onCrash */
@ -4598,11 +4598,15 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
def->mem.cur_balloon, (unsigned)rc); def->mem.cur_balloon, (unsigned)rc);
} }
rc = machine->vtbl->SetCPUCount(machine, def->vcpus); if (def->vcpus != def->maxvcpus) {
vboxError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("current vcpu count must equal maximum"));
}
rc = machine->vtbl->SetCPUCount(machine, def->maxvcpus);
if (NS_FAILED(rc)) { if (NS_FAILED(rc)) {
vboxError(VIR_ERR_INTERNAL_ERROR, vboxError(VIR_ERR_INTERNAL_ERROR,
_("could not set the number of virtual CPUs to: %lu, rc=%08x"), _("could not set the number of virtual CPUs to: %u, rc=%08x"),
def->vcpus, (unsigned)rc); def->maxvcpus, (unsigned)rc);
} }
#if VBOX_API_VERSION < 3001 #if VBOX_API_VERSION < 3001

View File

@ -2190,7 +2190,8 @@ xenDaemonParseSxpr(virConnectPtr conn,
} }
} }
def->vcpus = sexpr_int(root, "domain/vcpus"); def->maxvcpus = sexpr_int(root, "domain/vcpus");
def->vcpus = def->maxvcpus;
tmp = sexpr_node(root, "domain/on_poweroff"); tmp = sexpr_node(root, "domain/on_poweroff");
if (tmp != NULL) { if (tmp != NULL) {
@ -5649,7 +5650,7 @@ xenDaemonFormatSxprInput(virDomainInputDefPtr input,
* *
* Generate an SEXPR representing the domain configuration. * Generate an SEXPR representing the domain configuration.
* *
* Returns the 0 terminatedi S-Expr string or NULL in case of error. * Returns the 0 terminated S-Expr string or NULL in case of error.
* the caller must free() the returned value. * the caller must free() the returned value.
*/ */
char * char *
@ -5666,7 +5667,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
virBufferVSprintf(&buf, "(name '%s')", def->name); virBufferVSprintf(&buf, "(name '%s')", def->name);
virBufferVSprintf(&buf, "(memory %lu)(maxmem %lu)", virBufferVSprintf(&buf, "(memory %lu)(maxmem %lu)",
def->mem.cur_balloon/1024, def->mem.max_balloon/1024); def->mem.cur_balloon/1024, def->mem.max_balloon/1024);
virBufferVSprintf(&buf, "(vcpus %lu)", def->vcpus); virBufferVSprintf(&buf, "(vcpus %u)", def->maxvcpus);
if (def->cpumask) { if (def->cpumask) {
char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen); char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
@ -5761,7 +5762,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
else else
virBufferVSprintf(&buf, "(kernel '%s')", def->os.loader); virBufferVSprintf(&buf, "(kernel '%s')", def->os.loader);
virBufferVSprintf(&buf, "(vcpus %lu)", def->vcpus); virBufferVSprintf(&buf, "(vcpus %u)", def->maxvcpus);
for (i = 0 ; i < def->os.nBootDevs ; i++) { for (i = 0 ; i < def->os.nBootDevs ; i++) {
switch (def->os.bootDevs[i]) { switch (def->os.bootDevs[i]) {

View File

@ -678,6 +678,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
int i; int i;
const char *defaultArch, *defaultMachine; const char *defaultArch, *defaultMachine;
int vmlocaltime = 0; int vmlocaltime = 0;
unsigned long count;
if (VIR_ALLOC(def) < 0) { if (VIR_ALLOC(def) < 0) {
virReportOOMError(); virReportOOMError();
@ -770,9 +771,11 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
def->mem.cur_balloon *= 1024; def->mem.cur_balloon *= 1024;
def->mem.max_balloon *= 1024; def->mem.max_balloon *= 1024;
if (xenXMConfigGetULong(conf, "vcpus", &count, 1) < 0 ||
if (xenXMConfigGetULong(conf, "vcpus", &def->vcpus, 1) < 0) (unsigned short) count != count)
goto cleanup; goto cleanup;
def->maxvcpus = count;
def->vcpus = def->maxvcpus;
if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0) if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
goto cleanup; goto cleanup;
@ -1650,7 +1653,7 @@ int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) {
if (!(entry = virHashLookup(priv->configCache, filename))) if (!(entry = virHashLookup(priv->configCache, filename)))
goto cleanup; goto cleanup;
entry->def->vcpus = vcpus; entry->def->maxvcpus = entry->def->vcpus = vcpus;
/* If this fails, should we try to undo our changes to the /* If this fails, should we try to undo our changes to the
* in-memory representation of the config file. I say not! * in-memory representation of the config file. I say not!
@ -2241,7 +2244,7 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
if (xenXMConfigSetInt(conf, "memory", def->mem.cur_balloon / 1024) < 0) if (xenXMConfigSetInt(conf, "memory", def->mem.cur_balloon / 1024) < 0)
goto no_memory; goto no_memory;
if (xenXMConfigSetInt(conf, "vcpus", def->vcpus) < 0) if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
goto no_memory; goto no_memory;
if ((def->cpumask != NULL) && if ((def->cpumask != NULL) &&

View File

@ -1335,7 +1335,7 @@ xenapiDomainDumpXML (virDomainPtr dom, int flags ATTRIBUTE_UNUSED)
} else { } else {
defPtr->mem.cur_balloon = memory; defPtr->mem.cur_balloon = memory;
} }
defPtr->vcpus = xenapiDomainGetMaxVcpus(dom); defPtr->maxvcpus = defPtr->vcpus = xenapiDomainGetMaxVcpus(dom);
enum xen_on_normal_exit action; enum xen_on_normal_exit action;
if (xen_vm_get_actions_after_shutdown(session, &action, vm)) { if (xen_vm_get_actions_after_shutdown(session, &action, vm)) {
defPtr->onPoweroff = xenapiNormalExitEnum2virDomainLifecycle(action); defPtr->onPoweroff = xenapiNormalExitEnum2virDomainLifecycle(action);

View File

@ -510,8 +510,8 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
else else
(*record)->memory_dynamic_max = (*record)->memory_static_max; (*record)->memory_dynamic_max = (*record)->memory_static_max;
if (def->vcpus) { if (def->maxvcpus) {
(*record)->vcpus_max = (int64_t) def->vcpus; (*record)->vcpus_max = (int64_t) def->maxvcpus;
(*record)->vcpus_at_startup = (int64_t) def->vcpus; (*record)->vcpus_at_startup = (int64_t) def->vcpus;
} }
if (def->onPoweroff) if (def->onPoweroff)