<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>
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>
<ref name="schedparam"/>
</element>
</zeroOrMore>
+ <optional>
+ <element name="emulatorsched">
+ <ref name="schedparam"/>
+ </element>
+ </optional>
<zeroOrMore>
<element name="cachetune">
<attribute name="vcpus">
virDomainIOThreadIDDefArrayFree(def->iothreadids, def->niothreadids);
virBitmapFree(def->cputune.emulatorpin);
+ VIR_FREE(def->cputune.emulatorsched);
virDomainNumaFree(def->numa);
}
+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,
}
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"));
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);
unsigned long long iothread_period;
long long iothread_quota;
virBitmapPtr emulatorpin;
+ virDomainThreadSchedParamPtr emulatorsched;
};
--- /dev/null
+<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>
--- /dev/null
+<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>
DO_TEST("launch-security-sev");
+ DO_TEST_DIFFERENT("cputune");
+
virObjectUnref(caps);
virObjectUnref(xmlopt);