Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
docs/formatdomain.html.in | 17 ++++++----
docs/schemas/domaincommon.rng | 5 +++
src/conf/domain_conf.c | 44 +++++++++++++++++++++++++
src/conf/domain_conf.h | 1 +
tests/genericxml2xmlindata/cputune.xml | 37 +++++++++++++++++++++
tests/genericxml2xmloutdata/cputune.xml | 40 ++++++++++++++++++++++
tests/genericxml2xmltest.c | 2 ++
7 files changed, 140 insertions(+), 6 deletions(-)
create mode 100644 tests/genericxml2xmlindata/cputune.xml
create mode 100644 tests/genericxml2xmloutdata/cputune.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index af4b88c60984..74d32e2a9b8c 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -935,15 +935,19 @@
<span class="since">Only QEMU driver support since
2.1.0</span>
</dd>
- <dt><code>vcpusched</code> and
<code>iothreadsched</code></dt>
+ <dt><code>vcpusched</code>,
<code>iothreadsched</code>
+ and <code>emulatorsched</code></dt>
<dd>
- The optional <code>vcpusched</code> and
<code>iothreadsched</code>
- elements specify the scheduler type
+ The optional
+ <code>vcpusched</code>, <code>iothreadsched</code>
+ and <code>emulatorsched</code> elements specify the scheduler type
(values <code>batch</code>, <code>idle</code>,
<code>fifo</code>,
- <code>rr</code>) for particular vCPU and IOThread threads
respecively.
- The attributes <code>vcpus</code> and
<code>iothreads</code> select
+ <code>rr</code>) for particular vCPU, IOThread and emulator threads
+ respecively. For <code>vcpusched</code> and
<code>iothreadsched</code>
+ the attributes <code>vcpus</code> and
<code>iothreads</code> select
which vCPUs/IOThreads this setting applies to, leaving them out sets the
- default. Valid <code>vcpus</code> values start at 0 through one
less
+ default. The element <code>emulatorsched</code> does not have that
+ attribute. Valid <code>vcpus</code> values start at 0 through one
less
than the number of vCPU's defined for the
domain. Valid <code>iothreads</code> values are described in
the <code>iothreadids</code>
@@ -955,6 +959,7 @@
well (and is ignored for non-real-time ones). The value range
for the priority depends on the host kernel (usually 1-99).
<span class="since">Since 1.2.13</span>
+ <code>emulatorsched</code> <span class="since">since
5.3.0</span>
</dd>
<dt><code>cachetune</code><span
class="since">Since 4.1.0</span></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 623ef28719df..111b85c36fd3 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -967,6 +967,11 @@
<ref name="schedparam"/>
</element>
</zeroOrMore>
+ <optional>
+ <element name="emulatorsched">
+ <ref name="schedparam"/>
+ </element>
+ </optional>
<zeroOrMore>
<element name="cachetune">
<attribute name="vcpus">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e7b8b51aad0e..17e8975be399 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3396,6 +3396,7 @@ void virDomainDefFree(virDomainDefPtr def)
virDomainIOThreadIDDefArrayFree(def->iothreadids, def->niothreadids);
virBitmapFree(def->cputune.emulatorpin);
+ VIR_FREE(def->cputune.emulatorsched);
virDomainNumaFree(def->numa);
@@ -18483,6 +18484,25 @@ virDomainSchedulerParseCommonAttrs(xmlNodePtr node,
}
+static int
+virDomainEmulatorSchedParse(xmlNodePtr node,
+ virDomainDefPtr def)
+{
+ VIR_AUTOFREE(virDomainThreadSchedParamPtr) sched = NULL;
+
+ if (VIR_ALLOC(sched) < 0)
+ return -1;
+
+ if (virDomainSchedulerParseCommonAttrs(node,
+ &sched->policy,
+ &sched->priority) < 0)
+ return -1;
+
+ VIR_STEAL_PTR(def->cputune.emulatorsched, sched);
+ return 0;
+}
+
+
static virBitmapPtr
virDomainSchedulerParse(xmlNodePtr node,
const char *name,
@@ -19913,6 +19933,25 @@ virDomainDefParseXML(xmlDocPtr xml,
}
VIR_FREE(nodes);
+ if ((n = virXPathNodeSet("./cputune/emulatorsched", ctxt, &nodes)) <
0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("cannot extract emulatorsched nodes"));
+ goto error;
+ }
+
+ if (n) {
+ if (n > 1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("only one emulatorsched is supported"));
+ VIR_FREE(nodes);
+ goto error;
+ }
+
+ if (virDomainEmulatorSchedParse(nodes[0], def) < 0)
+ goto error;
+ }
+ VIR_FREE(nodes);
+
if ((n = virXPathNodeSet("./cputune/cachetune", ctxt, &nodes)) < 0)
{
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot extract cachetune nodes"));
@@ -27490,6 +27529,11 @@ virDomainCputuneDefFormat(virBufferPtr buf,
VIR_FREE(cpumask);
}
+ if (def->cputune.emulatorsched) {
+ virDomainSchedulerFormat(&childrenBuf, "emulator",
+ def->cputune.emulatorsched, 0, false);
+ }
+
for (i = 0; i < def->maxvcpus; i++) {
virDomainSchedulerFormat(&childrenBuf, "vcpu",
&def->vcpus[i]->sched, i, true);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 12eb71c1977e..988ef90f1189 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2159,6 +2159,7 @@ struct _virDomainCputune {
unsigned long long iothread_period;
long long iothread_quota;
virBitmapPtr emulatorpin;
+ virDomainThreadSchedParamPtr emulatorsched;
};
diff --git a/tests/genericxml2xmlindata/cputune.xml
b/tests/genericxml2xmlindata/cputune.xml
new file mode 100644
index 000000000000..999c8cef73cd
--- /dev/null
+++ b/tests/genericxml2xmlindata/cputune.xml
@@ -0,0 +1,37 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>4</vcpu>
+ <iothreads>4</iothreads>
+ <cputune>
+ <shares>2048</shares>
+ <period>1000000</period>
+ <quota>-1</quota>
+ <vcpupin vcpu='0' cpuset='0'/>
+ <vcpupin vcpu='1' cpuset='1'/>
+ <emulatorpin cpuset='1'/>
+ <emulatorsched scheduler='fifo' priority='2'/>
+ <vcpusched vcpus='0-1' scheduler='fifo' priority='1'/>
+ <vcpusched vcpus='1-3,^1' scheduler='idle'/>
+ <iothreadsched iothreads='1,3' scheduler='batch'/>
+ <iothreadsched iothreads='2' scheduler='rr'
priority='99'/>
+ </cputune>
+ <os>
+ <type arch='x86_64' machine='q35'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <smm state='on'>
+ <tseg unit='MiB'>48</tseg>
+ </smm>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/genericxml2xmloutdata/cputune.xml
b/tests/genericxml2xmloutdata/cputune.xml
new file mode 100644
index 000000000000..f9f99a4846e6
--- /dev/null
+++ b/tests/genericxml2xmloutdata/cputune.xml
@@ -0,0 +1,40 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>4</vcpu>
+ <iothreads>4</iothreads>
+ <cputune>
+ <shares>2048</shares>
+ <period>1000000</period>
+ <quota>-1</quota>
+ <vcpupin vcpu='0' cpuset='0'/>
+ <vcpupin vcpu='1' cpuset='1'/>
+ <emulatorpin cpuset='1'/>
+ <emulatorsched scheduler='fifo' priority='2'/>
+ <vcpusched vcpus='0' scheduler='fifo' priority='1'/>
+ <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
+ <vcpusched vcpus='2' scheduler='idle'/>
+ <vcpusched vcpus='3' scheduler='idle'/>
+ <iothreadsched iothreads='1' scheduler='batch'/>
+ <iothreadsched iothreads='2' scheduler='rr'
priority='99'/>
+ <iothreadsched iothreads='3' scheduler='batch'/>
+ </cputune>
+ <os>
+ <type arch='x86_64' machine='q35'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <smm state='on'>
+ <tseg unit='MiB'>48</tseg>
+ </smm>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
index 4393d444641d..1840d6e6a8f9 100644
--- a/tests/genericxml2xmltest.c
+++ b/tests/genericxml2xmltest.c
@@ -149,6 +149,8 @@ mymain(void)
DO_TEST("launch-security-sev");
+ DO_TEST_DIFFERENT("cputune");
+
virObjectUnref(caps);
virObjectUnref(xmlopt);
--
2.21.0