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