Like what we did for "disk", "filesystem" and "interface", this introduces sub-element <driver> for "controller", and put the "queues" into it. --- docs/formatdomain.html.in | 26 ++++++++++-------- docs/schemas/domaincommon.rng | 14 ++++++---- src/conf/domain_conf.c | 31 +++++++++++++++------- .../qemuxml2argv-disk-virtio-scsi-num_queues.xml | 4 ++- 4 files changed, 48 insertions(+), 27 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 3dbd58b..9dd283b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2135,17 +2135,14 @@ controller. A "scsi" controller has an optional attribute <code>model</code>, which is one of "auto", "buslogic", "ibmvscsi", "lsilogic", "lsisas1068", "lsisas1078", "virtio-scsi" or - "vmpvscsi". The attribute <code>queues</code> - (<span class="since">1.0.5 (QEMU and KVM only)</span>) specifies - the number of queues for the controller. For best performance, it's - recommended to specify a value matching the number of vCPUs. A "usb" - controller has an optional attribute <code>model</code>, which is one - of "piix3-uhci", "piix4-uhci", "ehci", "ich9-ehci1", "ich9-uhci1", - "ich9-uhci2", "ich9-uhci3", "vt82c686b-uhci", "pci-ohci" or "nec-xhci". - Additionally, <span class="since">since 0.10.0</span>, if the USB bus - needs to be explicitly disabled for the guest, <code>model='none'</code> - may be used. The PowerPC64 "spapr-vio" addresses do not have an - associated controller. + "vmpvscsi". A "usb" controller has an optional attribute + <code>model</code>, which is one of "piix3-uhci", "piix4-uhci", "ehci", + "ich9-ehci1", "ich9-uhci1", "ich9-uhci2", "ich9-uhci3", "vt82c686b-uhci", + "pci-ohci" or "nec-xhci". Additionally, + <span class="since">since 0.10.0</span>, if the USB bus needs to be + explicitly disabled for the guest, <code>model='none'</code> may be + used. The PowerPC64 "spapr-vio" addresses do not have an associated + controller. </p> <p> @@ -2156,6 +2153,13 @@ </p> <p> + An optional sub-element <code>driver</code> (<span class="since">1.0.5) + can specify the driver specific options. Currently it only supports + attribute <code>queues</code> (QEMU and KVM only), which specifies the + number of queues for the controller. For best performance, it's recommended + to specify a value matching the number of vCPUs. + </p> + <p> USB companion controllers have an optional sub-element <code><master></code> to specify the exact relationship of the companion to its master controller. diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index b1c4c2f..d22bb80 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1443,11 +1443,6 @@ </choice> </attribute> </optional> - <optional> - <attribute name="queues"> - <ref name="unsignedInt"/> - </attribute> - </optional> </group> <!-- usb has an optional attribute "model", and optional subelement "master" --> <group> @@ -1493,6 +1488,15 @@ </group> </choice> </interleave> + <optional> + <element name="driver"> + <optional> + <attribute name="queues"> + <ref name="unsignedInt"/> + </attribute> + </optional> + </element> + </optional> </element> </define> <define name="filesystem"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 253c9ef..0b432dd 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -5156,6 +5156,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, unsigned int flags) { virDomainControllerDefPtr def; + xmlNodePtr cur = NULL; char *type = NULL; char *idx = NULL; char *model = NULL; @@ -5195,12 +5196,19 @@ virDomainControllerDefParseXML(xmlNodePtr node, def->model = -1; } - if ((queues = virXMLPropString(node, "queues"))) { - if (virStrToLong_ui(queues, NULL, 10, &def->queues) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Malformed 'queues' value '%s'"), queues); - goto error; + cur = node->children; + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) { + if (xmlStrEqual(cur->name, BAD_CAST "driver")) + queues = virXMLPropString(cur, "queues"); } + cur = cur->next; + } + + if (queues && virStrToLong_ui(queues, NULL, 10, &def->queues) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Malformed 'queues' value '%s'"), queues); + goto error; } if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0) @@ -13524,9 +13532,6 @@ virDomainControllerDefFormat(virBufferPtr buf, virBufferEscapeString(buf, " model='%s'", model); } - if (def->queues) - virBufferAsprintf(buf, " queues='%u'", def->queues); - switch (def->type) { case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: if (def->opts.vioserial.ports != -1) { @@ -13543,10 +13548,16 @@ virDomainControllerDefFormat(virBufferPtr buf, break; } - if (virDomainDeviceInfoIsSet(&def->info, flags)) { + if (def->queues || virDomainDeviceInfoIsSet(&def->info, flags)) { virBufferAddLit(buf, ">\n"); - if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) + + if (def->queues) + virBufferAsprintf(buf, " <driver queues='%u'/>\n", def->queues); + + if (virDomainDeviceInfoIsSet(&def->info, flags) && + virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) return -1; + virBufferAddLit(buf, " </controller>\n"); } else { virBufferAddLit(buf, "/>\n"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml index b3b1289..fda976c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml @@ -20,7 +20,9 @@ <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> - <controller type='scsi' index='0' model='virtio-scsi' queues='8'/> + <controller type='scsi' index='0' model='virtio-scsi'> + <driver queues='8'/> + </controller> <memballoon model='virtio'/> </devices> </domain> -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list