1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-02-02 13:47:13 +03:00

conf: Store the iothread 'poll' settings in the XML

Currently we allow configuring the 'poll-max-ns', 'poll-grow', and
'poll-shrink' parameters of qemu iothreads only during runtime and they
are not persisted. Add XML machinery to persist them.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2023-02-23 13:48:35 +01:00
parent 6df1d137dd
commit 83eee66f81
5 changed files with 85 additions and 5 deletions

View File

@ -740,7 +740,9 @@ host/guest with many LUNs. :since:`Since 1.2.8 (QEMU only)`
<iothread id="2"/> <iothread id="2"/>
<iothread id="4"/> <iothread id="4"/>
<iothread id="6"/> <iothread id="6"/>
<iothread id="8" thread_pool_min="2" thread_pool_max="32"/> <iothread id="8" thread_pool_min="2" thread_pool_max="32">
<poll max='123' grow='456' shrink='789'/>
</iothread>
</iothreadids> </iothreadids>
<defaultiothread thread_pool_min="8" thread_pool_max="16"/> <defaultiothread thread_pool_min="8" thread_pool_max="16"/>
... ...
@ -766,6 +768,13 @@ host/guest with many LUNs. :since:`Since 1.2.8 (QEMU only)`
``thread_pool_max`` which allow setting lower and upper boundary for number ``thread_pool_max`` which allow setting lower and upper boundary for number
of worker threads for given IOThread. While the former can be value of zero, of worker threads for given IOThread. While the former can be value of zero,
the latter can't. :since:`Since 8.5.0` the latter can't. :since:`Since 8.5.0`
:since:`Since 9.4.0` an optional sub-element ``poll`` with can be used to
override the hypervisor-default interval of polling for the iothread before
it switches back to events. The optional attribute ``max`` sets the maximum
time polling should be used in nanoseconds. Setting ``max`` to ``0`` disables
polling. Attributes ``grow`` and ``shrink`` override (or disable when set to
``0`` the default steps for increasing/decreasing the polling interval if
the set interval is deemed insufficient or extensive.
``defaultiothread`` ``defaultiothread``
This element represents the default event loop within hypervisor, where I/O This element represents the default event loop within hypervisor, where I/O
requests from devices not assigned to a specific IOThread are processed. requests from devices not assigned to a specific IOThread are processed.

View File

@ -15721,6 +15721,7 @@ static virDomainIOThreadIDDef *
virDomainIOThreadIDDefParseXML(xmlNodePtr node) virDomainIOThreadIDDefParseXML(xmlNodePtr node)
{ {
g_autoptr(virDomainIOThreadIDDef) iothrid = virDomainIOThreadIDDefNew(); g_autoptr(virDomainIOThreadIDDef) iothrid = virDomainIOThreadIDDefNew();
xmlNodePtr pollNode;
if (virXMLPropUInt(node, "id", 10, if (virXMLPropUInt(node, "id", 10,
VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO, VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
@ -15737,6 +15738,28 @@ virDomainIOThreadIDDefParseXML(xmlNodePtr node)
&iothrid->thread_pool_max, -1) < 0) &iothrid->thread_pool_max, -1) < 0)
return NULL; return NULL;
if ((pollNode = virXMLNodeGetSubelement(node, "poll"))) {
int rc;
if ((rc = virXMLPropULongLong(pollNode, "max", 10, VIR_XML_PROP_NONE,
&iothrid->poll_max_ns)) < 0)
return NULL;
iothrid->set_poll_max_ns = rc == 1;
if ((rc = virXMLPropULongLong(pollNode, "grow", 10, VIR_XML_PROP_NONE,
&iothrid->poll_grow)) < 0)
return NULL;
iothrid->set_poll_grow = rc == 1;
if ((rc = virXMLPropULongLong(pollNode, "shrink", 10, VIR_XML_PROP_NONE,
&iothrid->poll_shrink)) < 0)
return NULL;
iothrid->set_poll_shrink = rc == 1;
}
return g_steal_pointer(&iothrid); return g_steal_pointer(&iothrid);
} }
@ -26630,6 +26653,9 @@ virDomainDefIothreadShouldFormat(const virDomainDef *def)
for (i = 0; i < def->niothreadids; i++) { for (i = 0; i < def->niothreadids; i++) {
if (!def->iothreadids[i]->autofill || if (!def->iothreadids[i]->autofill ||
def->iothreadids[i]->set_poll_max_ns ||
def->iothreadids[i]->set_poll_grow ||
def->iothreadids[i]->set_poll_shrink ||
def->iothreadids[i]->thread_pool_min >= 0 || def->iothreadids[i]->thread_pool_min >= 0 ||
def->iothreadids[i]->thread_pool_max >= 0) def->iothreadids[i]->thread_pool_max >= 0)
return true; return true;
@ -26678,6 +26704,8 @@ virDomainDefIOThreadsFormat(virBuffer *buf,
for (i = 0; i < def->niothreadids; i++) { for (i = 0; i < def->niothreadids; i++) {
virDomainIOThreadIDDef *iothread = def->iothreadids[i]; virDomainIOThreadIDDef *iothread = def->iothreadids[i];
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
g_auto(virBuffer) iothreadChildBuf = VIR_BUFFER_INIT_CHILD(&childrenBuf);
g_auto(virBuffer) pollAttrBuf = VIR_BUFFER_INITIALIZER;
virBufferAsprintf(&attrBuf, " id='%u'", virBufferAsprintf(&attrBuf, " id='%u'",
iothread->iothread_id); iothread->iothread_id);
@ -26692,7 +26720,18 @@ virDomainDefIOThreadsFormat(virBuffer *buf,
iothread->thread_pool_max); iothread->thread_pool_max);
} }
virXMLFormatElement(&childrenBuf, "iothread", &attrBuf, NULL); if (iothread->set_poll_max_ns)
virBufferAsprintf(&pollAttrBuf, " max='%llu'", iothread->poll_max_ns);
if (iothread->set_poll_grow)
virBufferAsprintf(&pollAttrBuf, " grow='%llu'", iothread->poll_grow);
if (iothread->set_poll_shrink)
virBufferAsprintf(&pollAttrBuf, " shrink='%llu'", iothread->poll_shrink);
virXMLFormatElement(&iothreadChildBuf, "poll", &pollAttrBuf, NULL);
virXMLFormatElement(&childrenBuf, "iothread", &attrBuf, &iothreadChildBuf);
} }
virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf); virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf);

View File

@ -2715,6 +2715,13 @@ struct _virDomainIOThreadIDDef {
virDomainThreadSchedParam sched; virDomainThreadSchedParam sched;
unsigned long long poll_max_ns;
bool set_poll_max_ns;
unsigned long long poll_grow;
bool set_poll_grow;
unsigned long long poll_shrink;
bool set_poll_shrink;
int thread_pool_min; int thread_pool_min;
int thread_pool_max; int thread_pool_max;
}; };

View File

@ -885,6 +885,25 @@
<ref name="unsignedInt"/> <ref name="unsignedInt"/>
</attribute> </attribute>
</optional> </optional>
<optional>
<element name="poll">
<optional>
<attribute name="max">
<ref name="unsignedInt"/>
</attribute>
</optional>
<optional>
<attribute name="grow">
<ref name="unsignedInt"/>
</attribute>
</optional>
<optional>
<attribute name="shrink">
<ref name="unsignedInt"/>
</attribute>
</optional>
</element>
</optional>
</element> </element>
</zeroOrMore> </zeroOrMore>
</element> </element>

View File

@ -7,9 +7,15 @@
<iothreads>5</iothreads> <iothreads>5</iothreads>
<iothreadids> <iothreadids>
<iothread id='2' thread_pool_min='0' thread_pool_max='60'/> <iothread id='2' thread_pool_min='0' thread_pool_max='60'/>
<iothread id='4' thread_pool_min='1' thread_pool_max='1'/> <iothread id='4' thread_pool_min='1' thread_pool_max='1'>
<iothread id='1'/> <poll max='123'/>
<iothread id='3'/> </iothread>
<iothread id='1'>
<poll grow='456' shrink='789'/>
</iothread>
<iothread id='3'>
<poll max='123000' grow='456' shrink='789'/>
</iothread>
<iothread id='5'/> <iothread id='5'/>
</iothreadids> </iothreadids>
<defaultiothread thread_pool_min='8' thread_pool_max='16'/> <defaultiothread thread_pool_min='8' thread_pool_max='16'/>