}
+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;
}
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;
}
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)"),
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;
}
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;
}
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,
virDomainThreadSchedParamPtr iothreadsched;
};
+
+typedef struct _virDomainVcpuInfo virDomainVcpuInfo;
+typedef virDomainVcpuInfo *virDomainVcpuInfoPtr;
+
+struct _virDomainVcpuInfo {
+ bool online;
+};
+
typedef struct _virDomainBlkiotune virDomainBlkiotune;
typedef virDomainBlkiotune *virDomainBlkiotunePtr;
virDomainBlkiotune blkio;
virDomainMemtune mem;
- unsigned int vcpus;
+ virDomainVcpuInfoPtr vcpus;
size_t maxvcpus;
int placement_mode;
virBitmapPtr cpumask;