mirror of https://gitee.com/openkylin/libvirt.git
domain_conf: Introduce iothreads XML
Introduce XML to allowing adding iothreads to the domain. These can be used by virtio-blk-pci devices in order to assign a specific thread to handle the workload for the device. The iothreads are the official implementation of the virtio-blk Data Plane that's been in tech preview for QEMU.
This commit is contained in:
parent
0322643ed5
commit
ee3a9620da
|
@ -470,6 +470,32 @@
|
|||
</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsIOThreadsAllocation">IOThreads Allocation</a></h3>
|
||||
<p>
|
||||
IOThreads are dedicated event loop threads for supported disk
|
||||
devices to perform block I/O requests in order to improve
|
||||
scalability especially on an SMP host/guest with many LUNs.
|
||||
<span class="since">Since 1.2.8 (QEMU only)</span>
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<domain>
|
||||
...
|
||||
<iothreads>4</iothreads>
|
||||
...
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>iothreads</code></dt>
|
||||
<dd>
|
||||
The content of this optional element defines the number
|
||||
of IOThreads to be assigned to the domain for use by
|
||||
virtio-blk-pci target storage devices. There should be
|
||||
only 1 or 2 IOThreads per host CPU. There may be more than
|
||||
supported device assigned to each IOThread.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsCPUTuning">CPU Tuning</a></h3>
|
||||
|
||||
|
|
|
@ -631,6 +631,12 @@
|
|||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<element name="iothreads">
|
||||
<ref name="unsignedInt"/>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<ref name="blkiotune"/>
|
||||
</optional>
|
||||
|
|
|
@ -11977,6 +11977,15 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||
}
|
||||
}
|
||||
|
||||
/* Optional - iothreads */
|
||||
tmp = virXPathString("string(./iothreads[1])", ctxt);
|
||||
if (tmp && virStrToLong_uip(tmp, NULL, 10, &def->iothreads) < 0) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("invalid iothreads count '%s'"), tmp);
|
||||
goto error;
|
||||
}
|
||||
VIR_FREE(tmp);
|
||||
|
||||
/* Extract cpu tunables. */
|
||||
if ((n = virXPathULong("string(./cputune/shares[1])", ctxt,
|
||||
&def->cputune.shares)) < -1) {
|
||||
|
@ -14566,6 +14575,14 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (src->iothreads != dst->iothreads) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Target domain iothreads count %u does not "
|
||||
"match source %u"),
|
||||
dst->iothreads, src->iothreads);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (STRNEQ(src->os.type, dst->os.type)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Target domain OS type %s does not match source %s"),
|
||||
|
@ -17971,6 +17988,9 @@ virDomainDefFormatInternal(virDomainDefPtr def,
|
|||
virBufferAsprintf(buf, " current='%u'", def->vcpus);
|
||||
virBufferAsprintf(buf, ">%u</vcpu>\n", def->maxvcpus);
|
||||
|
||||
if (def->iothreads > 0)
|
||||
virBufferAsprintf(buf, "<iothreads>%u</iothreads>\n", def->iothreads);
|
||||
|
||||
if (def->cputune.sharesSpecified ||
|
||||
(def->cputune.nvcpupin && !virDomainIsAllVcpupinInherited(def)) ||
|
||||
def->cputune.period || def->cputune.quota ||
|
||||
|
|
|
@ -1915,6 +1915,8 @@ struct _virDomainDef {
|
|||
int placement_mode;
|
||||
virBitmapPtr cpumask;
|
||||
|
||||
unsigned int iothreads;
|
||||
|
||||
struct {
|
||||
unsigned long shares;
|
||||
bool sharesSpecified;
|
||||
|
|
Loading…
Reference in New Issue