--- src/conf/domain_conf.c | 20 +++++++++++++++++--- src/conf/domain_conf.h | 1 + src/hyperv/hyperv_driver.c | 5 ++++- src/libvirt_private.syms | 1 + src/libxl/libxl_driver.c | 14 +++++++++----- src/lxc/lxc_native.c | 3 ++- src/openvz/openvz_conf.c | 3 ++- src/openvz/openvz_driver.c | 4 +++- src/phyp/phyp_driver.c | 3 ++- src/qemu/qemu_command.c | 12 ++++++++---- src/qemu/qemu_driver.c | 8 +++++--- src/test/test_driver.c | 8 +++++--- src/vbox/vbox_common.c | 6 ++++-- src/vmx/vmx.c | 3 ++- src/vz/vz_sdk.c | 3 ++- src/xen/xm_internal.c | 3 ++- src/xenapi/xenapi_driver.c | 3 ++- src/xenconfig/xen_common.c | 5 ++++- src/xenconfig/xen_sxpr.c | 11 ++++++++--- 19 files changed, 83 insertions(+), 33 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7d7ace9..ab2048b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1435,7 +1435,7 @@ virDomainDefSetVcpusMax(virDomainDefPtr def, unsigned int maxvcpus) { if (maxvcpus < def->vcpus) - def->vcpus = maxvcpus; + virDomainDefSetVcpus(def, maxvcpus); def->maxvcpus = maxvcpus; @@ -1457,6 +1457,16 @@ virDomainDefGetVcpusMax(const virDomainDef *def) } +int +virDomainDefSetVcpus(virDomainDefPtr def, + unsigned int vcpus) +{ + def->vcpus = vcpus; + + return 0; +} + + virDomainDiskDefPtr virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt) { @@ -14719,6 +14729,7 @@ virDomainVcpuParse(virDomainDefPtr def, int n; char *tmp = NULL; unsigned int maxvcpus; + unsigned int vcpus; int ret = -1; if ((n = virXPathUInt("string(./vcpu[1])", ctxt, &maxvcpus)) < 0) { @@ -14734,16 +14745,19 @@ virDomainVcpuParse(virDomainDefPtr def, if (virDomainDefSetVcpusMax(def, maxvcpus) < 0) goto cleanup; - if ((n = virXPathUInt("string(./vcpu[1]/@current)", ctxt, &def->vcpus)) < 0) { + if ((n = virXPathUInt("string(./vcpu[1]/@current)", ctxt, &vcpus)) < 0) { if (n == -2) { virReportError(VIR_ERR_XML_ERROR, "%s", _("current vcpus count must be an integer")); goto cleanup; } - def->vcpus = maxvcpus; + vcpus = maxvcpus; } + if (virDomainDefSetVcpus(def, vcpus) < 0) + goto cleanup; + if (maxvcpus < def->vcpus) { virReportError(VIR_ERR_INTERNAL_ERROR, _("maxvcpus must not be less than current vcpus " diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 2b2952a..bab8a5e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2340,6 +2340,7 @@ struct _virDomainDef { int virDomainDefSetVcpusMax(virDomainDefPtr def, unsigned int vcpus); bool virDomainDefHasVcpusOffline(const virDomainDef *def); unsigned int virDomainDefGetVcpusMax(const virDomainDef *def); +int virDomainDefSetVcpus(virDomainDefPtr def, unsigned int vcpus); unsigned long long virDomainDefGetMemoryInitial(const virDomainDef *def); void virDomainDefSetMemoryTotal(virDomainDefPtr def, unsigned long long size); diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 1e8db03..52e9e45 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -877,7 +877,10 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) processorSettingData->data->VirtualQuantity) < 0) goto cleanup; - def->vcpus = processorSettingData->data->VirtualQuantity; + if (virDomainDefSetVcpus(def, + processorSettingData->data->VirtualQuantity) < 0) + goto cleanup; + def->os.type = VIR_DOMAIN_OSTYPE_HVM; /* FIXME: devices section is totally missing */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index bba42c9..d9a0d4b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -232,6 +232,7 @@ virDomainDefParseString; virDomainDefPostParse; virDomainDefSetMemoryInitial; virDomainDefSetMemoryTotal; +virDomainDefSetVcpus; virDomainDefSetVcpusMax; virDomainDeleteConfig; virDomainDeviceAddressIsValid; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 217957c..905b392 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -555,7 +555,8 @@ libxlAddDom0(libxlDriverPrivatePtr driver) if (virDomainDefSetVcpusMax(vm->def, d_info.vcpu_max_id + 1)) goto cleanup; - vm->def->vcpus = d_info.vcpu_online; + if (virDomainDefSetVcpus(vm->def, d_info.vcpu_online) < 0) + goto cleanup; vm->def->mem.cur_balloon = d_info.current_memkb; virDomainDefSetMemoryTotal(vm->def, d_info.max_memkb); @@ -2191,7 +2192,8 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, break; case VIR_DOMAIN_VCPU_CONFIG: - def->vcpus = nvcpus; + if (virDomainDefSetVcpus(def, nvcpus) < 0) + goto cleanup; break; case VIR_DOMAIN_VCPU_LIVE: @@ -2201,7 +2203,8 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, " with libxenlight"), vm->def->id); goto endjob; } - vm->def->vcpus = nvcpus; + if (virDomainDefSetVcpus(vm->def, nvcpus) < 0) + goto endjob; break; case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG: @@ -2211,8 +2214,9 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, " with libxenlight"), vm->def->id); goto endjob; } - vm->def->vcpus = nvcpus; - def->vcpus = nvcpus; + if (virDomainDefSetVcpus(vm->def, nvcpus) < 0 || + virDomainDefSetVcpus(def, nvcpus) < 0) + goto endjob; break; } diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 1c65475..5dd3db4 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -1022,7 +1022,8 @@ lxcParseConfigString(const char *config) if (virDomainDefSetVcpusMax(vmdef, 1) < 0) goto error; - vmdef->vcpus = 1; + if (virDomainDefSetVcpus(vmdef, 1) < 0) + goto error; vmdef->nfss = 0; vmdef->os.type = VIR_DOMAIN_OSTYPE_EXE; diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 6629105..e32dd6f 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -585,7 +585,8 @@ int openvzLoadDomains(struct openvz_driver *driver) if (virDomainDefSetVcpusMax(def, vcpus) < 0) goto cleanup; - def->vcpus = vcpus; + if (virDomainDefSetVcpus(def, vcpus) < 0) + goto cleanup; /* XXX load rest of VM config data .... */ diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 5e55033..2a9e6ac 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1371,7 +1371,9 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm, if (virDomainDefSetVcpusMax(vm->def, nvcpus) < 0) return -1; - vm->def->vcpus = nvcpus; + if (virDomainDefSetVcpus(vm->def, nvcpus) < 0) + return -1; + return 0; } diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index b60e5ba..3d086e3 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -3298,7 +3298,8 @@ phypDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) if (virDomainDefSetVcpusMax(&def, vcpus) < 0) goto err; - def.vcpus = vcpus; + if (virDomainDefSetVcpus(&def, vcpus) < 0) + goto err; return virDomainDefFormat(&def, virDomainDefFormatConvertXMLFlags(flags)); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0a0bc3b..ccea41b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -12607,6 +12607,7 @@ qemuParseCommandLineSmp(virDomainDefPtr dom, unsigned int cores = 0; unsigned int threads = 0; unsigned int maxcpus = 0; + unsigned int vcpus = 0; size_t i; int nkws; char **kws; @@ -12621,9 +12622,8 @@ qemuParseCommandLineSmp(virDomainDefPtr dom, for (i = 0; i < nkws; i++) { if (vals[i] == NULL) { if (i > 0 || - virStrToLong_i(kws[i], &end, 10, &n) < 0 || *end != '\0') + virStrToLong_ui(kws[i], &end, 10, &vcpus) < 0 || *end != '\0') goto syntax; - dom->vcpus = n; } else { if (virStrToLong_i(vals[i], &end, 10, &n) < 0 || *end != '\0') goto syntax; @@ -12641,11 +12641,14 @@ qemuParseCommandLineSmp(virDomainDefPtr dom, } if (maxcpus == 0) - maxcpus = dom->vcpus; + maxcpus = vcpus; if (virDomainDefSetVcpusMax(dom, maxcpus) < 0) goto error; + if (virDomainDefSetVcpus(dom, vcpus) < 0) + goto error; + if (sockets && cores && threads) { virCPUDefPtr cpu; @@ -12760,7 +12763,8 @@ qemuParseCommandLine(virCapsPtr qemuCaps, virDomainDefSetMemoryTotal(def, def->mem.cur_balloon); if (virDomainDefSetVcpusMax(def, 1) < 0) goto error; - def->vcpus = 1; + if (virDomainDefSetVcpus(def, 1) < 0) + goto error; def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC; def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6013443..f07d7a7 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4835,8 +4835,9 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver, cleanup: VIR_FREE(cpupids); VIR_FREE(mem_mask); - if (virDomainObjIsActive(vm)) - vm->def->vcpus = vcpus; + if (virDomainObjIsActive(vm) && + virDomainDefSetVcpus(vm->def, vcpus) < 0) + ret = -1; virDomainAuditVcpu(vm, oldvcpus, nvcpus, "update", rc == 1); if (cgroup_vcpu) virCgroupFree(&cgroup_vcpu); @@ -4982,7 +4983,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, if (virDomainDefSetVcpusMax(persistentDef, nvcpus) < 0) goto endjob; } else { - persistentDef->vcpus = nvcpus; + if (virDomainDefSetVcpus(persistentDef, nvcpus) < 0) + goto endjob; } if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 71b4513..c9e3eba 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2374,15 +2374,17 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, goto cleanup; } - if (def) - def->vcpus = nrCpus; + if (def && + virDomainDefSetVcpus(def, nrCpus) < 0) + goto cleanup; if (persistentDef) { if (flags & VIR_DOMAIN_VCPU_MAXIMUM) { if (virDomainDefSetVcpusMax(persistentDef, nrCpus) < 0) goto cleanup; } else { - persistentDef->vcpus = nrCpus; + if (virDomainDefSetVcpus(persistentDef, nrCpus) < 0) + goto cleanup; } } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index e2e8ebc..087d2e2 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -3904,7 +3904,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) if (virDomainDefSetVcpusMax(def, CPUCount) < 0) goto cleanup; - def->vcpus = CPUCount; + if (virDomainDefSetVcpus(def, CPUCount) < 0) + goto cleanup; /* Skip cpumasklen, cpumask, onReboot, onPoweroff, onCrash */ @@ -6061,7 +6062,8 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, if (virDomainDefSetVcpusMax(def->dom, CPUCount) < 0) goto cleanup; - def->dom->vcpus = CPUCount; + if (virDomainDefSetVcpus(def->dom, CPUCount) < 0) + goto cleanup; if (vboxSnapshotGetReadWriteDisks(def, snapshot) < 0) VIR_DEBUG("Could not get read write disks for snapshot"); diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 4b94df2..bcc4034 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -1460,7 +1460,8 @@ virVMXParseConfig(virVMXContext *ctx, if (virDomainDefSetVcpusMax(def, numvcpus) < 0) goto cleanup; - def->vcpus = numvcpus; + if (virDomainDefSetVcpus(def, numvcpus) < 0) + goto cleanup; /* vmx:sched.cpu.affinity -> def:cpumask */ /* NOTE: maps to VirtualMachine:config.cpuAffinity.affinitySet */ diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index c90220c..890dd52 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1153,7 +1153,8 @@ prlsdkConvertCpuInfo(PRL_HANDLE sdkdom, if (virDomainDefSetVcpusMax(def, cpuCount) < 0) goto cleanup; - def->vcpus = cpuCount; + if (virDomainDefSetVcpus(def, cpuCount) < 0) + goto cleanup; pret = PrlVmCfg_GetCpuMask(sdkdom, NULL, &buflen); prlsdkCheckRetGoto(pret, cleanup); diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index a81a7d6..4a7d0de 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -708,7 +708,8 @@ xenXMDomainSetVcpusFlags(virConnectPtr conn, if (virDomainDefSetVcpusMax(entry->def, vcpus) < 0) goto cleanup; } else { - entry->def->vcpus = vcpus; + if (virDomainDefSetVcpus(entry->def, vcpus) < 0) + goto cleanup; } /* If this fails, should we try to undo our changes to the diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index fa66bb1..e4e9936 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -1505,7 +1505,8 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) if (virDomainDefSetVcpusMax(defPtr, vcpus) < 0) goto error; - defPtr->vcpus = vcpus; + if (virDomainDefSetVcpus(defPtr, vcpus) < 0) + goto error; enum xen_on_normal_exit action; if (xen_vm_get_actions_after_shutdown(session, &action, vm)) diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index 26e2d0d..d11a919 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -508,7 +508,10 @@ xenParseCPUFeatures(virConfPtr conf, virDomainDefPtr def) if (xenConfigGetULong(conf, "vcpu_avail", &count, -1) < 0) return -1; - def->vcpus = MIN(count_one_bits_l(count), virDomainDefGetVcpusMax(def)); + if (virDomainDefSetVcpus(def, MIN(count_one_bits_l(count), + virDomainDefGetVcpusMax(def))) < 0) + return -1; + if (xenConfigGetString(conf, "cpus", &str, NULL) < 0) return -1; diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c index 5386728..28b8e4e 100644 --- a/src/xenconfig/xen_sxpr.c +++ b/src/xenconfig/xen_sxpr.c @@ -1092,6 +1092,7 @@ xenParseSxpr(const struct sexpr *root, const char *tmp; virDomainDefPtr def; int hvm = 0, vmlocaltime; + unsigned int vcpus; if (!(def = virDomainDefNew())) goto error; @@ -1175,9 +1176,13 @@ 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 || virDomainDefGetVcpusMax(def) < def->vcpus) - def->vcpus = virDomainDefGetVcpusMax(def); + + vcpus = count_one_bits_l(sexpr_u64(root, "domain/vcpu_avail")); + if (!vcpus || virDomainDefGetVcpusMax(def) < vcpus) + vcpus = virDomainDefGetVcpusMax(def); + + if (virDomainDefSetVcpus(def, vcpus) < 0) + goto error; tmp = sexpr_node(root, "domain/on_poweroff"); if (tmp != NULL) { -- 2.6.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list