diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index f8d5f8921d0b556ef56beddaf58e30cd237373d0..c5ad6f4b803df1b04b1bc3596bda5bc332b59a1e 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -577,14 +577,12 @@
emulatorpin
The optional emulatorpin
element specifies which of host
- physical CPUs the "emulator", a subset of a domain not including vcpu,
- will be pinned to. If this is omitted, and attribute
+ physical CPUs the "emulator", a subset of a domain not including vcpu
+ or iothreads will be pinned to. If this is omitted, and attribute
cpuset
of element vcpu
is not specified,
"emulator" is pinned to all the physical CPUs by default. It contains
one required attribute cpuset
specifying which physical
- CPUs to pin to. NB, emulatorpin
is not allowed if
- attribute placement
of element vcpu
is
- "auto".
+ CPUs to pin to.
iothreadpin
@@ -598,8 +596,6 @@
iothread
value begins at "1" through the number of
iothreads
allocated to the domain. A value of "0" is not permitted.
- NB, iothreadpin
is not allowed if attribute
- placement
of element vcpu
is "auto".
Since 1.2.9
shares
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d562e1a405488b7cecc2598ffd8bf1f6682740d0..706e5d26c9a80718dde47dc3aae111ce342a7f14 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13084,28 +13084,20 @@ virDomainDefParseXML(xmlDocPtr xml,
goto error;
}
- /* Ignore emulatorpin if placement is "auto", they
- * conflicts with each other, and placement can't be
- * simply ignored, as 's placement defaults to it.
- */
if (n) {
- if (def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
- if (n > 1) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("only one emulatorpin is supported"));
- VIR_FREE(nodes);
- goto error;
- }
+ if (n > 1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("only one emulatorpin is supported"));
+ VIR_FREE(nodes);
+ goto error;
+ }
- def->cputune.emulatorpin = virDomainVcpuPinDefParseXML(nodes[0],
- ctxt, 0,
- true, false);
+ def->cputune.emulatorpin = virDomainVcpuPinDefParseXML(nodes[0],
+ ctxt, 0,
+ true, false);
- if (!def->cputune.emulatorpin)
- goto error;
- } else {
- VIR_WARN("Ignore emulatorpin for placement is 'auto'");
- }
+ if (!def->cputune.emulatorpin)
+ goto error;
}
VIR_FREE(nodes);
@@ -13116,38 +13108,28 @@ virDomainDefParseXML(xmlDocPtr xml,
goto error;
}
- /* Ignore iothreadpin if placement is "auto", they
- * conflict with each other, and placement can't be
- * simply ignored, as 's placement defaults to it.
- */
- if (n) {
- if (def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
- if (VIR_ALLOC_N(def->cputune.iothreadspin, n) < 0)
- goto error;
-
- for (i = 0; i < n; i++) {
- virDomainVcpuPinDefPtr iothreadpin = NULL;
- iothreadpin = virDomainVcpuPinDefParseXML(nodes[i], ctxt,
- def->iothreads,
- false, true);
- if (!iothreadpin)
- goto error;
+ if (n && VIR_ALLOC_N(def->cputune.iothreadspin, n) < 0)
+ goto error;
- if (virDomainVcpuPinIsDuplicate(def->cputune.iothreadspin,
- def->cputune.niothreadspin,
- iothreadpin->vcpuid)) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("duplicate iothreadpin for same iothread"));
- virDomainVcpuPinDefFree(iothreadpin);
- goto error;
- }
+ for (i = 0; i < n; i++) {
+ virDomainVcpuPinDefPtr iothreadpin = NULL;
+ iothreadpin = virDomainVcpuPinDefParseXML(nodes[i], ctxt,
+ def->iothreads,
+ false, true);
+ if (!iothreadpin)
+ goto error;
- def->cputune.iothreadspin[def->cputune.niothreadspin++] =
- iothreadpin;
- }
- } else {
- VIR_WARN("Ignore iothreadpin for placement is 'auto'");
+ if (virDomainVcpuPinIsDuplicate(def->cputune.iothreadspin,
+ def->cputune.niothreadspin,
+ iothreadpin->vcpuid)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("duplicate iothreadpin for same iothread"));
+ virDomainVcpuPinDefFree(iothreadpin);
+ goto error;
}
+
+ def->cputune.iothreadspin[def->cputune.niothreadspin++] =
+ iothreadpin;
}
VIR_FREE(nodes);
@@ -13185,7 +13167,9 @@ virDomainDefParseXML(xmlDocPtr xml,
ctxt) < 0)
goto error;
- if (virDomainNumatuneHasPlacementAuto(def->numatune) && !def->cpumask)
+ if (virDomainNumatuneHasPlacementAuto(def->numatune) &&
+ !def->cpumask && !def->cputune.vcpupin &&
+ !def->cputune.emulatorpin && !def->cputune.iothreadspin)
def->placement_mode = VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO;
if ((n = virXPathNodeSet("./resource", ctxt, &nodes)) < 0) {
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune-numatune.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune-numatune.xml
new file mode 100644
index 0000000000000000000000000000000000000000..01bbb3d5d9905ff0d44a8b4848e36150c48d657c
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune-numatune.xml
@@ -0,0 +1,37 @@
+
+ dummy2
+ 4d92ec27-9ebf-400b-ae91-20c71c647c19
+ 131072
+ 65536
+ 6
+ 2
+
+
+
+
+
+
+
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vcpu-placement-static.xml b/tests/qemuxml2argvdata/qemuxml2argv-vcpu-placement-static.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c2de610340186b028ae7b0a45025ae4b8a35afd4
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-vcpu-placement-static.xml
@@ -0,0 +1,37 @@
+
+ dummy2
+ 4d92ec27-9ebf-400b-ae91-20c71c647c19
+ 131072
+ 65536
+ 6
+ 2
+
+
+
+
+
+
+
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-x86_64
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index f12983c9d2f3f0e663b51e0e3f3989944d9dac6b..a0a1cab206c7ec7aced60a8d593bafc407a76437 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -310,6 +310,8 @@ mymain(void)
DO_TEST("blkiotune-device");
DO_TEST("cputune");
DO_TEST("cputune-zero-shares");
+ DO_TEST("cputune-numatune");
+ DO_TEST("vcpu-placement-static");
DO_TEST("smp");
DO_TEST("iothreads");