conf: Add support for emulatorsched

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Martin Kletzander 2019-04-15 10:45:38 +02:00
parent c79a39e60c
commit 842bc56ad2
7 changed files with 140 additions and 6 deletions

View File

@ -938,15 +938,19 @@
<span class="since">Only QEMU driver support since 2.1.0</span> <span class="since">Only QEMU driver support since 2.1.0</span>
</dd> </dd>
<dt><code>vcpusched</code> and <code>iothreadsched</code></dt> <dt><code>vcpusched</code>, <code>iothreadsched</code>
and <code>emulatorsched</code></dt>
<dd> <dd>
The optional <code>vcpusched</code> and <code>iothreadsched</code> The optional
elements specify the scheduler type <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>, (values <code>batch</code>, <code>idle</code>, <code>fifo</code>,
<code>rr</code>) for particular vCPU and IOThread threads respecively. <code>rr</code>) for particular vCPU, IOThread and emulator threads
The attributes <code>vcpus</code> and <code>iothreads</code> select 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 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 than the number of vCPU's defined for the
domain. Valid <code>iothreads</code> values are described in domain. Valid <code>iothreads</code> values are described in
the <code>iothreadids</code> the <code>iothreadids</code>
@ -958,6 +962,7 @@
well (and is ignored for non-real-time ones). The value range well (and is ignored for non-real-time ones). The value range
for the priority depends on the host kernel (usually 1-99). for the priority depends on the host kernel (usually 1-99).
<span class="since">Since 1.2.13</span> <span class="since">Since 1.2.13</span>
<code>emulatorsched</code> <span class="since">since 5.3.0</span>
</dd> </dd>
<dt><code>cachetune</code><span class="since">Since 4.1.0</span></dt> <dt><code>cachetune</code><span class="since">Since 4.1.0</span></dt>

View File

@ -967,6 +967,11 @@
<ref name="schedparam"/> <ref name="schedparam"/>
</element> </element>
</zeroOrMore> </zeroOrMore>
<optional>
<element name="emulatorsched">
<ref name="schedparam"/>
</element>
</optional>
<zeroOrMore> <zeroOrMore>
<element name="cachetune"> <element name="cachetune">
<attribute name="vcpus"> <attribute name="vcpus">

View File

@ -3396,6 +3396,7 @@ void virDomainDefFree(virDomainDefPtr def)
virDomainIOThreadIDDefArrayFree(def->iothreadids, def->niothreadids); virDomainIOThreadIDDefArrayFree(def->iothreadids, def->niothreadids);
virBitmapFree(def->cputune.emulatorpin); virBitmapFree(def->cputune.emulatorpin);
VIR_FREE(def->cputune.emulatorsched);
virDomainNumaFree(def->numa); 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 static virBitmapPtr
virDomainSchedulerParse(xmlNodePtr node, virDomainSchedulerParse(xmlNodePtr node,
const char *name, const char *name,
@ -19913,6 +19933,25 @@ virDomainDefParseXML(xmlDocPtr xml,
} }
VIR_FREE(nodes); 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) { if ((n = virXPathNodeSet("./cputune/cachetune", ctxt, &nodes)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot extract cachetune nodes")); _("cannot extract cachetune nodes"));
@ -27490,6 +27529,11 @@ virDomainCputuneDefFormat(virBufferPtr buf,
VIR_FREE(cpumask); VIR_FREE(cpumask);
} }
if (def->cputune.emulatorsched) {
virDomainSchedulerFormat(&childrenBuf, "emulator",
def->cputune.emulatorsched, 0, false);
}
for (i = 0; i < def->maxvcpus; i++) { for (i = 0; i < def->maxvcpus; i++) {
virDomainSchedulerFormat(&childrenBuf, "vcpu", virDomainSchedulerFormat(&childrenBuf, "vcpu",
&def->vcpus[i]->sched, i, true); &def->vcpus[i]->sched, i, true);

View File

@ -2159,6 +2159,7 @@ struct _virDomainCputune {
unsigned long long iothread_period; unsigned long long iothread_period;
long long iothread_quota; long long iothread_quota;
virBitmapPtr emulatorpin; virBitmapPtr emulatorpin;
virDomainThreadSchedParamPtr emulatorsched;
}; };

View File

@ -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>

View File

@ -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>

View File

@ -149,6 +149,8 @@ mymain(void)
DO_TEST("launch-security-sev"); DO_TEST("launch-security-sev");
DO_TEST_DIFFERENT("cputune");
virObjectUnref(caps); virObjectUnref(caps);
virObjectUnref(xmlopt); virObjectUnref(xmlopt);