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:
parent
6df1d137dd
commit
83eee66f81
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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>
|
||||||
|
@ -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'/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user