To allow collecting all relevant data at one place let's make def->vcpus a structure and then we can start moving stuff into it. --- src/conf/domain_conf.c | 55 ++++++++++++++++++++++++++++++++++++++++++++------ src/conf/domain_conf.h | 10 ++++++++- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2bc0f1c..ed4fe29 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1430,14 +1430,32 @@ void virDomainLeaseDefFree(virDomainLeaseDefPtr def) } +static void +virDomainVcpuInfoClear(virDomainVcpuInfoPtr info) +{ + if (!info) + return; +} + + int virDomainDefSetVcpusMax(virDomainDefPtr def, unsigned int maxvcpus) { - if (maxvcpus < def->vcpus) - virDomainDefSetVcpus(def, maxvcpus); + size_t i; - def->maxvcpus = maxvcpus; + if (def->maxvcpus == maxvcpus) + return 0; + + if (def->maxvcpus < maxvcpus) { + if (VIR_EXPAND_N(def->vcpus, def->maxvcpus, maxvcpus - def->maxvcpus) < 0) + return -1; + } else { + for (i = maxvcpus; i < def->maxvcpus; i++) + virDomainVcpuInfoClear(&def->vcpus[i]); + + VIR_SHRINK_N(def->vcpus, def->maxvcpus, def->maxvcpus - maxvcpus); + } return 0; } @@ -1446,7 +1464,14 @@ virDomainDefSetVcpusMax(virDomainDefPtr def, bool virDomainDefHasVcpusOffline(const virDomainDef *def) { - return def->vcpus < def->maxvcpus; + size_t i; + + for (i = 0; i < def->maxvcpus; i++) { + if (!def->vcpus[i].online) + return true; + } + + return false; } @@ -1461,6 +1486,8 @@ int virDomainDefSetVcpus(virDomainDefPtr def, unsigned int vcpus) { + size_t i; + if (vcpus > def->maxvcpus) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("maxvcpus must not be less than current vcpus (%u < %zu)"), @@ -1468,7 +1495,11 @@ virDomainDefSetVcpus(virDomainDefPtr def, return -1; } - def->vcpus = vcpus; + for (i = 0; i < vcpus; i++) + def->vcpus[i].online = true; + + for (i = vcpus; i < def->maxvcpus; i++) + def->vcpus[i].online = false; return 0; } @@ -1477,7 +1508,15 @@ virDomainDefSetVcpus(virDomainDefPtr def, unsigned int virDomainDefGetVcpus(const virDomainDef *def) { - return def->vcpus; + size_t i; + unsigned int ret = 0; + + for (i = 0; i < def->maxvcpus; i++) { + if (def->vcpus[i].online) + ret++; + } + + return ret; } @@ -2505,6 +2544,10 @@ void virDomainDefFree(virDomainDefPtr def) virDomainResourceDefFree(def->resource); + for (i = 0; i < def->maxvcpus; i++) + virDomainVcpuInfoClear(&def->vcpus[i]); + VIR_FREE(def->vcpus); + /* hostdevs must be freed before nets (or any future "intelligent * hostdevs") because the pointer to the hostdev is really * pointing into the middle of the higher level device's object, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index b681bd2..ad6c401 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2139,6 +2139,14 @@ struct _virDomainCputune { virDomainThreadSchedParamPtr iothreadsched; }; + +typedef struct _virDomainVcpuInfo virDomainVcpuInfo; +typedef virDomainVcpuInfo *virDomainVcpuInfoPtr; + +struct _virDomainVcpuInfo { + bool online; +}; + typedef struct _virDomainBlkiotune virDomainBlkiotune; typedef virDomainBlkiotune *virDomainBlkiotunePtr; @@ -2212,7 +2220,7 @@ struct _virDomainDef { virDomainBlkiotune blkio; virDomainMemtune mem; - unsigned int vcpus; + virDomainVcpuInfoPtr vcpus; size_t maxvcpus; int placement_mode; virBitmapPtr cpumask; -- 2.6.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list