domain_conf: Add support for iothreads in disk definition

Add a new disk "driver" attribute "iothread" to be parsed as the thread
number for the disk to use. In order to more easily facilitate the usage
and configuration of the iothread, a "zero" for the attribute indicates
iothreads are not supported for the device and a positive value indicates
the specific thread to try and use.
This commit is contained in:
John Ferlan 2014-08-25 08:43:17 -04:00
parent 72edaae78f
commit e2523de554
4 changed files with 32 additions and 1 deletions

View File

@ -2160,6 +2160,14 @@
(ignore the discard request). (ignore the discard request).
<span class='since'>Since 1.0.6 (QEMU and KVM only)</span> <span class='since'>Since 1.0.6 (QEMU and KVM only)</span>
</li> </li>
<li>
The optional <code>iothread</code> attribute assigns the
disk to an IOThread as defined by the range for the domain
<a href="#elementsIOThreadsAllocation"><code>iothreads</code></a>
value. Multiple devices may be assigned to the same IOThread and
are numbered from 1 to the domain iothreads value.
<span class='since'>Since 1.2.8 (QEMU only)</span>
</li>
</ul> </ul>
</dd> </dd>
<dt><code>boot</code></dt> <dt><code>boot</code></dt>

View File

@ -1572,6 +1572,9 @@
<optional> <optional>
<ref name="discard"/> <ref name="discard"/>
</optional> </optional>
<optional>
<ref name="driverIOThread"/>
</optional>
<empty/> <empty/>
</element> </element>
</define> </define>
@ -1659,6 +1662,11 @@
</choice> </choice>
</attribute> </attribute>
</define> </define>
<define name="driverIOThread">
<attribute name='iothread'>
<ref name="unsignedInt"/>
</attribute>
</define>
<define name="controller"> <define name="controller">
<element name="controller"> <element name="controller">
<attribute name="index"> <attribute name="index">

View File

@ -5422,6 +5422,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
char *ioeventfd = NULL; char *ioeventfd = NULL;
char *event_idx = NULL; char *event_idx = NULL;
char *copy_on_read = NULL; char *copy_on_read = NULL;
char *driverIOThread = NULL;
char *devaddr = NULL; char *devaddr = NULL;
virStorageEncryptionPtr encryption = NULL; virStorageEncryptionPtr encryption = NULL;
char *serial = NULL; char *serial = NULL;
@ -5570,6 +5571,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
event_idx = virXMLPropString(cur, "event_idx"); event_idx = virXMLPropString(cur, "event_idx");
copy_on_read = virXMLPropString(cur, "copy_on_read"); copy_on_read = virXMLPropString(cur, "copy_on_read");
discard = virXMLPropString(cur, "discard"); discard = virXMLPropString(cur, "discard");
driverIOThread = virXMLPropString(cur, "iothread");
} else if (!def->mirror && } else if (!def->mirror &&
xmlStrEqual(cur->name, BAD_CAST "mirror") && xmlStrEqual(cur->name, BAD_CAST "mirror") &&
!(flags & VIR_DOMAIN_XML_INACTIVE)) { !(flags & VIR_DOMAIN_XML_INACTIVE)) {
@ -6104,6 +6106,15 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
} }
} }
if (driverIOThread) {
if (virStrToLong_uip(driverIOThread, NULL, 10, &def->iothread) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("Invalid iothread attribute in disk driver "
"element: %s"), driverIOThread);
goto error;
}
}
if (devaddr) { if (devaddr) {
if (virDomainParseLegacyDeviceAddress(devaddr, if (virDomainParseLegacyDeviceAddress(devaddr,
&def->info.addr.pci) < 0) { &def->info.addr.pci) < 0) {
@ -6204,6 +6215,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_FREE(event_idx); VIR_FREE(event_idx);
VIR_FREE(copy_on_read); VIR_FREE(copy_on_read);
VIR_FREE(discard); VIR_FREE(discard);
VIR_FREE(driverIOThread);
VIR_FREE(devaddr); VIR_FREE(devaddr);
VIR_FREE(serial); VIR_FREE(serial);
virStorageEncryptionFree(encryption); virStorageEncryptionFree(encryption);
@ -15637,7 +15649,7 @@ virDomainDiskDefFormat(virBufferPtr buf,
if (def->src->driverName || def->src->format > 0 || def->cachemode || if (def->src->driverName || def->src->format > 0 || def->cachemode ||
def->error_policy || def->rerror_policy || def->iomode || def->error_policy || def->rerror_policy || def->iomode ||
def->ioeventfd || def->event_idx || def->copy_on_read || def->ioeventfd || def->event_idx || def->copy_on_read ||
def->discard) { def->discard || def->iothread) {
virBufferAddLit(buf, "<driver"); virBufferAddLit(buf, "<driver");
if (def->src->driverName) if (def->src->driverName)
virBufferAsprintf(buf, " name='%s'", def->src->driverName); virBufferAsprintf(buf, " name='%s'", def->src->driverName);
@ -15660,6 +15672,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " copy_on_read='%s'", copy_on_read); virBufferAsprintf(buf, " copy_on_read='%s'", copy_on_read);
if (def->discard) if (def->discard)
virBufferAsprintf(buf, " discard='%s'", discard); virBufferAsprintf(buf, " discard='%s'", discard);
if (def->iothread)
virBufferAsprintf(buf, " iothread='%u'", def->iothread);
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} }

View File

@ -667,6 +667,7 @@ struct _virDomainDiskDef {
int rawio; /* no = 0, yes = 1 */ int rawio; /* no = 0, yes = 1 */
int sgio; /* enum virDomainDeviceSGIO */ int sgio; /* enum virDomainDeviceSGIO */
int discard; /* enum virDomainDiskDiscard */ int discard; /* enum virDomainDiskDiscard */
unsigned int iothread; /* unused = 0, > 0 specific thread # */
}; };