On 01/14/2016 11:27 AM, Peter Krempa wrote:
Now with the new struct the data can be stored in a much saner
place.
---
src/conf/domain_conf.c | 131 ++++++++++++++++++--------------------------
src/conf/domain_conf.h | 3 +-
src/libxl/libxl_domain.c | 17 +++---
src/libxl/libxl_driver.c | 39 ++++++--------
src/qemu/qemu_cgroup.c | 15 ++----
src/qemu/qemu_driver.c | 138 ++++++++++++++++++++++-------------------------
src/qemu/qemu_process.c | 38 +++++++------
src/test/test_driver.c | 43 ++++++---------
8 files changed, 179 insertions(+), 245 deletions(-)
Not sure why patch 19 is interspersed since 18 and 20 are "related"
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 29ef357..ca32466 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1289,6 +1289,8 @@ virDomainVcpuInfoClear(virDomainVcpuInfoPtr info)
{
if (!info)
return;
+
+ virBitmapFree(info->cpumask);
Will there need to be a vcpuinfo->cpumask = NULL afterwards? Since this
is pass by value and not reference.
This is called by virDomainDefSetVcpusMax so it's not just in a pur
*Free path
}
@@ -1422,7 +1424,14 @@ virDomainDefGetVcpu(virDomainDefPtr def,
static bool
virDomainDefHasVcpusPin(const virDomainDef *def)
{
- return !!def->cputune.nvcpupin;
+ size_t i;
+
+ for (i = 0; i < def->maxvcpus; i++) {
+ if (def->vcpus[i].cpumask)
+ return true;
+ }
+
+ return false;
}
@@ -2593,8 +2602,6 @@ void virDomainDefFree(virDomainDefPtr def)
virDomainIOThreadIDDefArrayFree(def->iothreadids, def->niothreadids);
- virDomainPinDefArrayFree(def->cputune.vcpupin, def->cputune.nvcpupin);
-
virBitmapFree(def->cputune.emulatorpin);
for (i = 0; i < def->cputune.nvcpusched; i++)
@@ -14137,77 +14144,62 @@ virDomainIOThreadIDDefParseXML(xmlNodePtr node,
}
-/* Check if pin with same id already exists. */
-static bool
-virDomainPinIsDuplicate(virDomainPinDefPtr *def,
- int npin,
- int id)
-{
- size_t i;
-
- if (!def || !npin)
- return false;
-
- for (i = 0; i < npin; i++) {
- if (def[i]->id == id)
- return true;
- }
-
- return false;
-}
-
/* Parse the XML definition for a vcpupin
*
* vcpupin has the form of
* <vcpupin vcpu='0' cpuset='0'/>
*/
-static virDomainPinDefPtr
-virDomainVcpuPinDefParseXML(xmlNodePtr node,
- xmlXPathContextPtr ctxt)
+static int
+virDomainVcpuPinDefParseXML(virDomainDefPtr def,
+ xmlNodePtr node)
{
- virDomainPinDefPtr def;
- xmlNodePtr oldnode = ctxt->node;
+ virDomainVcpuInfoPtr vcpu;
unsigned int vcpuid;
char *tmp = NULL;
+ int ret = -1;
- if (VIR_ALLOC(def) < 0)
- return NULL;
-
- ctxt->node = node;
-
- if (!(tmp = virXPathString("string(./@vcpu)", ctxt))) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("missing vcpu id in vcpupin"));
- goto error;
+ if (!(tmp = virXMLPropString(node, "vcpu"))) {
+ virReportError(VIR_ERR_XML_ERROR, "%s", _("missing vcpu id in
vcpupin"));
+ goto cleanup;
}
if (virStrToLong_uip(tmp, NULL, 10, &vcpuid) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("invalid setting for vcpu '%s'"), tmp);
- goto error;
+ goto cleanup;
}
VIR_FREE(tmp);
- def->id = vcpuid;
+ if (!(vcpu = virDomainDefGetVcpu(def, vcpuid)) ||
+ !vcpu->online) {
+ /* To avoid the regression when daemon loading domain confs, we can't
+ * simply error out if <vcpupin> nodes greater than current vcpus.
+ * Ignore them instead. */
+ VIR_WARN("Ignoring vcpupin for missing vcpus");
Is this message true for !online as well? or just there because of the
maxvcpus check?
BTW: Another place where checking an OnlineVcpuMap could be beneficial.
+ ret = 0;
+ goto cleanup;
+ }
if (!(tmp = virXMLPropString(node, "cpuset"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("missing cpuset for vcpupin"));
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing cpuset for vcpupin"));
+ goto cleanup;
+ }
- goto error;
+ if (vcpu->cpumask) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("duplicate vcpupin for vcpu '%d'"), vcpuid);
+ goto cleanup;
}
I would think this check could go prior to parsing "cpuset"
- if (virBitmapParse(tmp, 0, &def->cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0)
- goto error;
+ if (virBitmapParse(tmp, 0, &vcpu->cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0)
+ goto cleanup;
+
+ ret = 0;
cleanup:
VIR_FREE(tmp);
- ctxt->node = oldnode;
- return def;
-
- error:
- VIR_FREE(def);
- goto cleanup;
+ return ret;
}
@@ -15131,34 +15123,9 @@ virDomainDefParseXML(xmlDocPtr xml,
if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0)
goto error;
- if (n && VIR_ALLOC_N(def->cputune.vcpupin, n) < 0)
- goto error;
-
for (i = 0; i < n; i++) {
- virDomainPinDefPtr vcpupin;
- if (!(vcpupin = virDomainVcpuPinDefParseXML(nodes[i], ctxt)))
+ if (virDomainVcpuPinDefParseXML(def, nodes[i]))
goto error;
-
- if (virDomainPinIsDuplicate(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- vcpupin->id)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("duplicate vcpupin for same
vcpu"));
- virDomainPinDefFree(vcpupin);
- goto error;
- }
-
- if (vcpupin->id >= virDomainDefGetVcpus(def)) {
- /* To avoid the regression when daemon loading
- * domain confs, we can't simply error out if
- * <vcpupin> nodes greater than current vcpus,
- * ignoring them instead.
- */
- VIR_WARN("Ignore vcpupin for missing vcpus");
- virDomainPinDefFree(vcpupin);
- } else {
- def->cputune.vcpupin[def->cputune.nvcpupin++] = vcpupin;
- }
}
VIR_FREE(nodes);
@@ -21838,15 +21805,19 @@ virDomainDefFormatInternal(virDomainDefPtr def,
"</emulator_quota>\n",
def->cputune.emulator_quota);
- for (i = 0; i < def->cputune.nvcpupin; i++) {
+ for (i = 0; i < def->maxvcpus; i++) {
char *cpumask;
- virBufferAsprintf(&childrenBuf, "<vcpupin vcpu='%u' ",
- def->cputune.vcpupin[i]->id);
+ virDomainVcpuInfoPtr vcpu = def->vcpus + i;
- if (!(cpumask = virBitmapFormat(def->cputune.vcpupin[i]->cpumask)))
+ if (!vcpu->cpumask)
+ continue;
+
+ if (!(cpumask = virBitmapFormat(vcpu->cpumask)))
goto error;
- virBufferAsprintf(&childrenBuf, "cpuset='%s'/>\n",
cpumask);
+ virBufferAsprintf(&childrenBuf,
+ "<vcpupin vcpu='%zu'
cpuset='%s'/>\n", i, cpumask);
+
VIR_FREE(cpumask);
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index f15b558..4a8c199 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2137,8 +2137,6 @@ struct _virDomainCputune {
long long quota;
unsigned long long emulator_period;
long long emulator_quota;
- size_t nvcpupin;
- virDomainPinDefPtr *vcpupin;
virBitmapPtr emulatorpin;
size_t nvcpusched;
@@ -2153,6 +2151,7 @@ typedef virDomainVcpuInfo *virDomainVcpuInfoPtr;
struct _virDomainVcpuInfo {
bool online;
+ virBitmapPtr cpumask;
bikeshed...
why not 'cpupinmask' (or something to make it easier to find)
I understand the desire to keep things named similarly (cpumask), but it
just makes it more difficult to "find" specific instances...
};
typedef struct _virDomainBlkiotune virDomainBlkiotune;
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 37c92c6..99ce44a 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -816,7 +816,7 @@ int
libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
{
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
- virDomainPinDefPtr pin;
+ virDomainVcpuInfoPtr vcpu;
libxl_bitmap map;
virBitmapPtr cpumask = NULL;
size_t i;
@@ -825,13 +825,12 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver,
virDomainObjPtr vm)
libxl_bitmap_init(&map);
for (i = 0; i < virDomainDefGetVcpus(vm->def); ++i) {
Here's another OnlineVcpuMap perusal opportunity...
- pin = virDomainPinFind(vm->def->cputune.vcpupin,
- vm->def->cputune.nvcpupin,
- i);
+ vcpu = virDomainDefGetVcpu(vm->def, i);
- if (pin && pin->cpumask)
- cpumask = pin->cpumask;
- else
+ if (!vcpu->online)
+ continue;
+
+ if (!(cpumask = vcpu->cpumask))
cpumask = vm->def->cpumask;
if (!cpumask)
@@ -840,9 +839,9 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver,
virDomainObjPtr vm)
if (virBitmapToData(cpumask, &map.map, (int *)&map.size) < 0)
goto cleanup;
- if (libxl_set_vcpuaffinity(cfg->ctx, vm->def->id, pin->id, &map)
!= 0) {
+ if (libxl_set_vcpuaffinity(cfg->ctx, vm->def->id, i, &map) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to pin vcpu '%d' with
libxenlight"), pin->id);
+ _("Failed to pin vcpu '%zu' with
libxenlight"), i);
goto cleanup;
}
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 26c1a43..b9da190 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -2321,6 +2321,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virDomainDefPtr targetDef = NULL;
virBitmapPtr pcpumap = NULL;
+ virDomainVcpuInfoPtr vcpuinfo;
virDomainObjPtr vm;
int ret = -1;
@@ -2352,10 +2353,16 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
/* Make sure coverity knows targetDef is valid at this point. */
sa_assert(targetDef);
- pcpumap = virBitmapNewData(cpumap, maplen);
- if (!pcpumap)
+ if (!(pcpumap = virBitmapNewData(cpumap, maplen)))
goto endjob;
+ if (!(vcpuinfo = virDomainDefGetVcpu(targetDef, vcpu)) ||
+ !vcpuinfo->online) {
Ditto
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("vcpu '%u' is not active"), vcpu);
+ goto endjob;
+ }
+
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
libxl_bitmap map = { .size = maplen, .map = cpumap };
if (libxl_set_vcpuaffinity(cfg->ctx, vm->def->id, vcpu, &map) != 0)
{
@@ -2366,20 +2373,9 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu,
}
}
- if (!targetDef->cputune.vcpupin) {
- if (VIR_ALLOC(targetDef->cputune.vcpupin) < 0)
- goto endjob;
- targetDef->cputune.nvcpupin = 0;
- }
- if (virDomainPinAdd(&targetDef->cputune.vcpupin,
- &targetDef->cputune.nvcpupin,
- cpumap,
- maplen,
- vcpu) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("failed to update or add vcpupin
xml"));
- goto endjob;
- }
+ virBitmapFree(vcpuinfo->cpumask);
+ vcpuinfo->cpumask = pcpumap;
+ pcpumap = NULL;
ret = 0;
@@ -2455,15 +2451,14 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps,
memset(cpumaps, 0x00, maplen * ncpumaps);
for (vcpu = 0; vcpu < ncpumaps; vcpu++) {
- virDomainPinDefPtr pininfo;
+ virDomainVcpuInfoPtr vcpuinfo = virDomainDefGetVcpu(targetDef, vcpu);
virBitmapPtr bitmap = NULL;
- pininfo = virDomainPinFind(targetDef->cputune.vcpupin,
- targetDef->cputune.nvcpupin,
- vcpu);
+ if (!vcpuinfo->online)
+ continue;
here too in some way (OnlineVcpuMap)
- if (pininfo && pininfo->cpumask)
- bitmap = pininfo->cpumask;
+ if (vcpuinfo->cpumask)
+ bitmap = vcpuinfo->cpumask;
else if (targetDef->cpumask)
bitmap = targetDef->cpumask;
else
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index 1c406ce..3744b52 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -1007,7 +1007,7 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
virCgroupPtr cgroup_vcpu = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainDefPtr def = vm->def;
- size_t i, j;
+ size_t i;
unsigned long long period = vm->def->cputune.period;
long long quota = vm->def->cputune.quota;
char *mem_mask = NULL;
@@ -1065,20 +1065,13 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
virCgroupSetCpusetMems(cgroup_vcpu, mem_mask) < 0)
goto cleanup;
- /* try to use the default cpu maps */
- if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
+ if (vcpu->cpumask)
+ cpumap = vcpu->cpumask;
+ else if (vm->def->placement_mode ==
VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
cpumap = priv->autoCpuset;
else
cpumap = vm->def->cpumask;
- /* lookup a more specific pinning info */
- for (j = 0; j < def->cputune.nvcpupin; j++) {
- if (def->cputune.vcpupin[j]->id == i) {
- cpumap = def->cputune.vcpupin[j]->cpumask;
- break;
- }
- }
-
if (!cpumap)
continue;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0a4de1b..f253248 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4769,10 +4769,7 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
VIR_CGROUP_THREAD_VCPU, vcpu) < 0)
goto cleanup;
- /* Free vcpupin setting */
- virDomainPinDel(&vm->def->cputune.vcpupin,
- &vm->def->cputune.nvcpupin,
- vcpu);
+ virBitmapFree(vcpuinfo->cpumask);
Will there need to be a vcpuinfo->cpumask = NULL afterwards? Since this
is pass by value and not reference.
ret = 0;
@@ -4937,10 +4934,13 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
if (persistentDef) {
/* remove vcpupin entries for vcpus that were unplugged */
if (nvcpus < virDomainDefGetVcpus(persistentDef)) {
- for (i = virDomainDefGetVcpus(persistentDef) - 1; i >= nvcpus; i--)
- virDomainPinDel(&persistentDef->cputune.vcpupin,
- &persistentDef->cputune.nvcpupin,
- i);
+ for (i = virDomainDefGetVcpus(persistentDef) - 1; i >= nvcpus; i--) {
+ virDomainVcpuInfoPtr vcpu = virDomainDefGetVcpu(persistentDef,
+ i);
+
+ if (vcpu)
+ virBitmapFree(vcpu->cpumask);
Will there need to be a vcpuinfo->cpumask = NULL afterwards? Since this
is pass by value and not reference.
+ }
}
if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
@@ -4999,9 +4999,11 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
virCgroupPtr cgroup_vcpu = NULL;
int ret = -1;
qemuDomainObjPrivatePtr priv;
- size_t newVcpuPinNum = 0;
- virDomainPinDefPtr *newVcpuPin = NULL;
virBitmapPtr pcpumap = NULL;
+ virBitmapPtr pcpumaplive = NULL;
+ virBitmapPtr pcpumappersist = NULL;
+ virDomainVcpuInfoPtr vcpuinfolive = NULL;
+ virDomainVcpuInfoPtr vcpuinfopersist = NULL;
virQEMUDriverConfigPtr cfg = NULL;
virObjectEventPtr event = NULL;
char paramField[VIR_TYPED_PARAM_FIELD_LENGTH] = "";
@@ -5029,18 +5031,36 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
priv = vm->privateData;
- if (def && vcpu >= virDomainDefGetVcpus(def)) {
- virReportError(VIR_ERR_INVALID_ARG,
- _("vcpu %d is out of range of live cpu count %d"),
- vcpu, virDomainDefGetVcpus(def));
- goto endjob;
+ if (def) {
+ if (!(vcpuinfolive = virDomainDefGetVcpu(def, vcpu))) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("vcpu %d is out of range of live cpu count %d"),
+ vcpu, virDomainDefGetVcpus(def));
+ goto endjob;
+ }
+
+ if (!vcpuinfolive->online) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("setting cpu pinning for inactive vcpu '%d' is
not "
+ "supported"), vcpu);
Another place for OnlineVcpuMap (persist path too)
+ goto endjob;
+ }
}
- if (persistentDef && vcpu >= virDomainDefGetVcpus(persistentDef)) {
- virReportError(VIR_ERR_INVALID_ARG,
- _("vcpu %d is out of range of persistent cpu count
%d"),
- vcpu, virDomainDefGetVcpus(persistentDef));
- goto endjob;
+ if (persistentDef) {
+ if (!(vcpuinfopersist = virDomainDefGetVcpu(persistentDef, vcpu))) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("vcpu %d is out of range of persistent cpu count
%d"),
+ vcpu, virDomainDefGetVcpus(persistentDef));
+ goto endjob;
+ }
+
+ if (!vcpuinfopersist->online) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("setting cpu pinning for inactive vcpu '%d' is
not "
+ "supported"), vcpu);
+ goto endjob;
+ }
}
if (!(pcpumap = virBitmapNewData(cpumap, maplen)))
@@ -5052,6 +5072,10 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
goto endjob;
}
+ if ((def && !(pcpumaplive = virBitmapNewCopy(pcpumap))) ||
+ (persistentDef && !(pcpumappersist = virBitmapNewCopy(pcpumap))))
+ goto endjob;
+
if (def) {
if (!qemuDomainHasVcpuPids(vm)) {
virReportError(VIR_ERR_OPERATION_INVALID,
@@ -5059,26 +5083,6 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
goto endjob;
}
- if (def->cputune.vcpupin) {
- newVcpuPin = virDomainPinDefCopy(def->cputune.vcpupin,
- def->cputune.nvcpupin);
- if (!newVcpuPin)
- goto endjob;
-
- newVcpuPinNum = def->cputune.nvcpupin;
- } else {
- if (VIR_ALLOC(newVcpuPin) < 0)
- goto endjob;
- newVcpuPinNum = 0;
- }
-
- if (virDomainPinAdd(&newVcpuPin, &newVcpuPinNum,
- cpumap, maplen, vcpu) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("failed to update vcpupin"));
- goto endjob;
- }
-
/* Configure the corresponding cpuset cgroup before set affinity. */
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpu,
@@ -5100,13 +5104,9 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
}
}
- if (def->cputune.vcpupin)
- virDomainPinDefArrayFree(def->cputune.vcpupin,
- def->cputune.nvcpupin);
-
- def->cputune.vcpupin = newVcpuPin;
- def->cputune.nvcpupin = newVcpuPinNum;
- newVcpuPin = NULL;
+ virBitmapFree(vcpuinfolive->cpumask);
+ vcpuinfolive->cpumask = pcpumaplive;
+ pcpumaplive = NULL;
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
goto endjob;
@@ -5125,24 +5125,12 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
}
if (persistentDef) {
- if (!persistentDef->cputune.vcpupin) {
- if (VIR_ALLOC(persistentDef->cputune.vcpupin) < 0)
- goto endjob;
- persistentDef->cputune.nvcpupin = 0;
- }
- if (virDomainPinAdd(&persistentDef->cputune.vcpupin,
- &persistentDef->cputune.nvcpupin,
- cpumap,
- maplen,
- vcpu) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("failed to update or add vcpupin xml of "
- "a persistent domain"));
- goto endjob;
- }
+ virBitmapFree(vcpuinfopersist->cpumask);
+ vcpuinfopersist->cpumask = pcpumappersist;
+ pcpumappersist = NULL;
- ret = virDomainSaveConfig(cfg->configDir, persistentDef);
- goto endjob;
+ if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0)
+ goto endjob;
}
This looked OK, but the names of the new variables caused a few brain
cramps... Like a long runon sentence.
ret = 0;
@@ -5151,14 +5139,14 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
qemuDomainObjEndJob(driver, vm);
cleanup:
- if (newVcpuPin)
- virDomainPinDefArrayFree(newVcpuPin, newVcpuPinNum);
if (cgroup_vcpu)
virCgroupFree(&cgroup_vcpu);
virDomainObjEndAPI(&vm);
qemuDomainEventQueue(driver, event);
VIR_FREE(str);
virBitmapFree(pcpumap);
+ virBitmapFree(pcpumaplive);
+ virBitmapFree(pcpumappersist);
virObjectUnref(cfg);
return ret;
}
@@ -5183,7 +5171,8 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom,
virDomainObjPtr vm = NULL;
virDomainDefPtr def;
int ret = -1;
- int hostcpus, vcpu;
+ int hostcpus;
+ size_t i;
virBitmapPtr allcpumap = NULL;
qemuDomainObjPrivatePtr priv = NULL;
@@ -5215,16 +5204,15 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom,
if (ncpumaps < 1)
goto cleanup;
- for (vcpu = 0; vcpu < ncpumaps; vcpu++) {
- virDomainPinDefPtr pininfo;
+ for (i = 0; i < ncpumaps; i++) {
+ virDomainVcpuInfoPtr vcpu = virDomainDefGetVcpu(def, i);
virBitmapPtr bitmap = NULL;
- pininfo = virDomainPinFind(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- vcpu);
+ if (!vcpu->online)
+ continue;
- if (pininfo && pininfo->cpumask)
- bitmap = pininfo->cpumask;
+ if (vcpu->cpumask)
+ bitmap = vcpu->cpumask;
else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO
&&
priv->autoCpuset)
bitmap = priv->autoCpuset;
@@ -5233,7 +5221,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom,
else
bitmap = allcpumap;
- virBitmapToDataBuf(bitmap, VIR_GET_CPUMAP(cpumaps, maplen, vcpu), maplen);
+ virBitmapToDataBuf(bitmap, VIR_GET_CPUMAP(cpumaps, maplen, i), maplen);
}
ret = ncpumaps;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 64b58be..c0043c9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2163,23 +2163,23 @@ static int
qemuProcessSetVcpuAffinities(virDomainObjPtr vm)
{
virDomainDefPtr def = vm->def;
- virDomainPinDefPtr pininfo;
- int n;
+ virDomainVcpuInfoPtr vcpu;
+ size_t i;
int ret = -1;
- VIR_DEBUG("Setting affinity on CPUs nvcpupin=%zu nvcpus=%d
hasVcpupids=%d",
- def->cputune.nvcpupin, virDomainDefGetVcpus(def),
- qemuDomainHasVcpuPids(vm));
- if (!def->cputune.nvcpupin)
- return 0;
+ VIR_DEBUG("Setting affinity on CPUs");
if (!qemuDomainHasVcpuPids(vm)) {
/* If any CPU has custom affinity that differs from the
* VM default affinity, we must reject it
*/
- for (n = 0; n < def->cputune.nvcpupin; n++) {
- if (def->cputune.vcpupin[n]->cpumask &&
- !virBitmapEqual(def->cpumask,
- def->cputune.vcpupin[n]->cpumask)) {
+ for (i = 0; i < virDomainDefGetVcpusMax(def); i++) {
+ vcpu = virDomainDefGetVcpu(def, i);
+
+ if (!vcpu->online)
+ continue;
Another OnlineVcpuMap opportunity.
+
+ if (vcpu->cpumask &&
+ !virBitmapEqual(def->cpumask, vcpu->cpumask)) {
virReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("cpu affinity is not
supported"));
return -1;
@@ -2188,22 +2188,20 @@ qemuProcessSetVcpuAffinities(virDomainObjPtr vm)
return 0;
}
- for (n = 0; n < virDomainDefGetVcpus(def); n++) {
+ for (i = 0; i < virDomainDefGetVcpusMax(def); i++) {
virBitmapPtr bitmap;
- /* set affinity only for existing vcpus */
- if (!(pininfo = virDomainPinFind(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- n)))
+
+ vcpu = virDomainDefGetVcpu(def, i);
+
+ if (!vcpu->online)
continue;
- if (!(bitmap = pininfo->cpumask) &&
+ if (!(bitmap = vcpu->cpumask) &&
!(bitmap = def->cpumask))
continue;
- if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, n),
- pininfo->cpumask) < 0) {
+ if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, i), bitmap) < 0)
goto cleanup;
- }
}
ret = 0;
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 5986749..ed4de12 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -2455,15 +2455,14 @@ static int testDomainGetVcpus(virDomainPtr domain,
memset(cpumaps, 0, maxinfo * maplen);
for (i = 0; i < maxinfo; i++) {
- virDomainPinDefPtr pininfo;
+ virDomainVcpuInfoPtr vcpu = virDomainDefGetVcpu(def, i);
virBitmapPtr bitmap = NULL;
- pininfo = virDomainPinFind(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- i);
+ if (vcpu && !vcpu->online)
+ continue;
Another OnlineVcpuMap opportunity (and the following change too)
- if (pininfo && pininfo->cpumask)
- bitmap = pininfo->cpumask;
+ if (vcpu->cpumask)
+ bitmap = vcpu->cpumask;
else if (def->cpumask)
bitmap = def->cpumask;
else
@@ -2492,6 +2491,7 @@ static int testDomainPinVcpu(virDomainPtr domain,
unsigned char *cpumap,
int maplen)
{
+ virDomainVcpuInfoPtr vcpuinfo;
virDomainObjPtr privdom;
virDomainDefPtr def;
int ret = -1;
@@ -2507,29 +2507,21 @@ static int testDomainPinVcpu(virDomainPtr domain,
goto cleanup;
}
- if (vcpu > virDomainDefGetVcpus(privdom->def)) {
+ if (!(vcpuinfo = virDomainDefGetVcpu(def, vcpu)) ||
+ !vcpuinfo->online) {
virReportError(VIR_ERR_INVALID_ARG,
_("requested vcpu '%d' is not present in the
domain"),
vcpu);
goto cleanup;
}
- if (!def->cputune.vcpupin) {
- if (VIR_ALLOC(def->cputune.vcpupin) < 0)
- goto cleanup;
- def->cputune.nvcpupin = 0;
- }
- if (virDomainPinAdd(&def->cputune.vcpupin,
- &def->cputune.nvcpupin,
- cpumap,
- maplen,
- vcpu) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("failed to update or add vcpupin"));
+ virBitmapFree(vcpuinfo->cpumask);
+
+ if (!(vcpuinfo->cpumask = virBitmapNewData(cpumap, maplen)))
goto cleanup;
- }
ret = 0;
+
cleanup:
virDomainObjEndAPI(&privdom);
return ret;
@@ -2566,15 +2558,14 @@ testDomainGetVcpuPinInfo(virDomainPtr dom,
ncpumaps = virDomainDefGetVcpus(def);
for (vcpu = 0; vcpu < ncpumaps; vcpu++) {
- virDomainPinDefPtr pininfo;
+ virDomainVcpuInfoPtr vcpuinfo = virDomainDefGetVcpu(def, vcpu);
virBitmapPtr bitmap = NULL;
- pininfo = virDomainPinFind(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- vcpu);
+ if (vcpuinfo && !vcpuinfo->online)
+ continue;
- if (pininfo && pininfo->cpumask)
- bitmap = pininfo->cpumask;
+ if (vcpuinfo->cpumask)
+ bitmap = vcpuinfo->cpumask;
else if (def->cpumask)
bitmap = def->cpumask;
else