The <defaultiothread/> element is formatted inside virDomainDefaultIOThreadDefFormat() which is called only from virDomainDefIOThreadsFormat() (so that IOThread related stuff is formatted calling one function). However, when there are no <iothreadids/> defined (or only autoallocated ones are present), then the outer formatting function exits early never calling the <defaultiothread/> formatter. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- src/conf/domain_conf.c | 46 ++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b639022396..24f17a8b91 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26349,40 +26349,38 @@ static void virDomainDefIOThreadsFormat(virBuffer *buf, const virDomainDef *def) { - g_auto(virBuffer) childrenBuf = VIR_BUFFER_INIT_CHILD(buf); - size_t i; - - if (def->niothreadids == 0) - return; + if (def->niothreadids > 0) { + virBufferAsprintf(buf, "<iothreads>%zu</iothreads>\n", + def->niothreadids); + } - virBufferAsprintf(buf, "<iothreads>%zu</iothreads>\n", - def->niothreadids); + if (virDomainDefIothreadShouldFormat(def)) { + g_auto(virBuffer) childrenBuf = VIR_BUFFER_INIT_CHILD(buf); + size_t i; - if (!virDomainDefIothreadShouldFormat(def)) - return; + for (i = 0; i < def->niothreadids; i++) { + virDomainIOThreadIDDef *iothread = def->iothreadids[i]; + g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; - for (i = 0; i < def->niothreadids; i++) { - virDomainIOThreadIDDef *iothread = def->iothreadids[i]; - g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + virBufferAsprintf(&attrBuf, " id='%u'", + iothread->iothread_id); - virBufferAsprintf(&attrBuf, " id='%u'", - iothread->iothread_id); + if (iothread->thread_pool_min >= 0) { + virBufferAsprintf(&attrBuf, " thread_pool_min='%d'", + iothread->thread_pool_min); + } - if (iothread->thread_pool_min >= 0) { - virBufferAsprintf(&attrBuf, " thread_pool_min='%d'", - iothread->thread_pool_min); - } + if (iothread->thread_pool_max >= 0) { + virBufferAsprintf(&attrBuf, " thread_pool_max='%d'", + iothread->thread_pool_max); + } - if (iothread->thread_pool_max >= 0) { - virBufferAsprintf(&attrBuf, " thread_pool_max='%d'", - iothread->thread_pool_max); + virXMLFormatElement(&childrenBuf, "iothread", &attrBuf, NULL); } - virXMLFormatElement(&childrenBuf, "iothread", &attrBuf, NULL); + virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf); } - virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf); - virDomainDefaultIOThreadDefFormat(buf, def); } -- 2.35.1