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(a)redhat.com>
---
docs/formatdomain.rst | 11 ++++-
src/conf/domain_conf.c | 41 ++++++++++++++++++-
src/conf/domain_conf.h | 7 ++++
src/conf/schemas/domaincommon.rng | 19 +++++++++
.../iothreads-ids-pool-sizes.xml | 12 ++++--
5 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 638768c18d..eff17c1532 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -730,7 +730,9 @@ host/guest with many LUNs. :since:`Since 1.2.8 (QEMU only)`
<iothread id="2"/>
<iothread id="4"/>
<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>
<defaultiothread thread_pool_min="8"
thread_pool_max="16"/>
...
@@ -756,6 +758,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
of worker threads for given IOThread. While the former can be value of zero,
the latter can't. :since:`Since 8.5.0`
+ :since:`Since 9.1.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``
This element represents the default event loop within hypervisor, where I/O
requests from devices not assigned to a specific IOThread are processed.
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ad2b44b610..9426d55f8d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15779,6 +15779,7 @@ static virDomainIOThreadIDDef *
virDomainIOThreadIDDefParseXML(xmlNodePtr node)
{
g_autoptr(virDomainIOThreadIDDef) iothrid = virDomainIOThreadIDDefNew();
+ xmlNodePtr pollNode;
if (virXMLPropUInt(node, "id", 10,
VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
@@ -15795,6 +15796,28 @@ virDomainIOThreadIDDefParseXML(xmlNodePtr node)
&iothrid->thread_pool_max, -1) < 0)
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 = virXMLPropUInt(pollNode, "grow", 10, VIR_XML_PROP_NONE,
+ &iothrid->poll_grow)) < 0)
+ return NULL;
+
+ iothrid->set_poll_grow = rc == 1;
+
+ if ((rc = virXMLPropUInt(pollNode, "shrink", 10, VIR_XML_PROP_NONE,
+ &iothrid->poll_shrink)) < 0)
+ return NULL;
+
+ iothrid->set_poll_shrink = rc == 1;
+ }
+
return g_steal_pointer(&iothrid);
}
@@ -26655,6 +26678,9 @@ virDomainDefIothreadShouldFormat(const virDomainDef *def)
for (i = 0; i < def->niothreadids; i++) {
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_max >= 0)
return true;
@@ -26703,6 +26729,8 @@ virDomainDefIOThreadsFormat(virBuffer *buf,
for (i = 0; i < def->niothreadids; i++) {
virDomainIOThreadIDDef *iothread = def->iothreadids[i];
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'",
iothread->iothread_id);
@@ -26717,7 +26745,18 @@ virDomainDefIOThreadsFormat(virBuffer *buf,
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='%u'",
iothread->poll_grow);
+
+ if (iothread->set_poll_shrink)
+ virBufferAsprintf(&pollAttrBuf, " shrink='%u'",
iothread->poll_shrink);
+
+ virXMLFormatElement(&iothreadChildBuf, "poll",
&pollAttrBuf, NULL);
+
+ virXMLFormatElement(&childrenBuf, "iothread", &attrBuf,
&iothreadChildBuf);
}
virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 2a8ad17f44..f6dade62fc 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2710,6 +2710,13 @@ struct _virDomainIOThreadIDDef {
virDomainThreadSchedParam sched;
+ unsigned long long poll_max_ns;
+ bool set_poll_max_ns;
+ unsigned int poll_grow;
+ bool set_poll_grow;
+ unsigned int poll_shrink;
+ bool set_poll_shrink;
+
int thread_pool_min;
int thread_pool_max;
};
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index ab4886b783..5a1d79672f 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -879,6 +879,25 @@
<ref name="unsignedInt"/>
</attribute>
</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>
</zeroOrMore>
</element>
diff --git a/tests/qemuxml2argvdata/iothreads-ids-pool-sizes.xml
b/tests/qemuxml2argvdata/iothreads-ids-pool-sizes.xml
index df4b291a7a..63fb4a52f6 100644
--- a/tests/qemuxml2argvdata/iothreads-ids-pool-sizes.xml
+++ b/tests/qemuxml2argvdata/iothreads-ids-pool-sizes.xml
@@ -7,9 +7,15 @@
<iothreads>5</iothreads>
<iothreadids>
<iothread id='2' thread_pool_min='0'
thread_pool_max='60'/>
- <iothread id='4' thread_pool_min='1'
thread_pool_max='1'/>
- <iothread id='1'/>
- <iothread id='3'/>
+ <iothread id='4' thread_pool_min='1'
thread_pool_max='1'>
+ <poll max='123'/>
+ </iothread>
+ <iothread id='1'>
+ <poll grow='456' shrink='789'/>
+ </iothread>
+ <iothread id='3'>
+ <poll max='123000' grow='456' shrink='789'/>
+ </iothread>
<iothread id='5'/>
</iothreadids>
<defaultiothread thread_pool_min='8' thread_pool_max='16'/>
--
2.39.2