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:
John Ferlan 2014-08-22 10:15:51 -04:00
parent 0322643ed5
commit ee3a9620da
4 changed files with 54 additions and 0 deletions

View File

@ -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>
&lt;domain&gt;
...
&lt;iothreads&gt;4&lt;/iothreads&gt;
...
&lt;/domain&gt;
</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>

View File

@ -631,6 +631,12 @@
</element>
</optional>
<optional>
<element name="iothreads">
<ref name="unsignedInt"/>
</element>
</optional>
<optional>
<ref name="blkiotune"/>
</optional>

View File

@ -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 ||

View File

@ -1915,6 +1915,8 @@ struct _virDomainDef {
int placement_mode;
virBitmapPtr cpumask;
unsigned int iothreads;
struct {
unsigned long shares;
bool sharesSpecified;