[libvirt] [PATCHv3 01/11] Introduce /domain/devices/interface/driver/@queues attribute
Laine Stump
laine at laine.org
Thu May 16 20:57:04 UTC 2013
On 05/16/2013 08:49 AM, Michal Privoznik wrote:
> This attribute is going to represent number of queues for
> multique vhost network interface. This commit implements XML
> extension part of the feature and add one test as well. For now,
> we can only do xml2xml test as qemu command line generation code
> is not adapted yet.
> ---
> docs/formatdomain.html.in | 12 ++++-
> docs/schemas/domaincommon.rng | 5 +++
> src/conf/domain_conf.c | 15 +++++++
> src/conf/domain_conf.h | 1 +
> .../qemuxml2argvdata/qemuxml2argv-vhost_queues.xml | 51 ++++++++++++++++++++++
> tests/qemuxml2xmltest.c | 1 +
> 6 files changed, 84 insertions(+), 1 deletion(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 5e89a92..217202d 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -3248,7 +3248,7 @@ qemu-kvm -net nic,model=? /dev/null
> <source network='default'/>
> <target dev='vnet1'/>
> <model type='virtio'/>
> - <b><driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/></b>
> + <b><driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='5'/></b>
> </interface>
> </devices>
> ...</pre>
> @@ -3342,6 +3342,16 @@ qemu-kvm -net nic,model=? /dev/null
> <b>In general you should leave this option alone, unless you
> are very certain you know what you are doing.</b>
> </dd>
> + <dt><code>queues</code></dt>
> + <dd>
> + The optional <code>queues</code> attribute controls number of
> + queues for <a href="http://www.linux-kvm.org/page/Multiqueue">
"the number of queues to be used for the <a href..."
> + Multiqueue virtio-net</a> feature. If the interface has <code><model
> + type='virtio'/></code>, multiple packet processing queues can be
> + created; each queue will potentially be handled by a different
> + processor, resulting in much higher throughput.
> + <span class="since">Since 1.0.6 (QEMU and KVM only)</span>
> + </dd>
> </dl>
>
> <h5><a name="elementsNICSTargetOverride">Overriding the target element</a></h5>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 361794e..500c43c 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -2008,6 +2008,11 @@
> </attribute>
> </optional>
> <optional>
> + <attribute name='queues'>
> + <ref name="positiveInteger"/>
> + </attribute>
> + </optional>
> + <optional>
> <attribute name="txmode">
> <choice>
> <value>iothread</value>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index f0ca9d5..4a120f6 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -5950,6 +5950,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
> char *txmode = NULL;
> char *ioeventfd = NULL;
> char *event_idx = NULL;
> + char *queues = NULL;
> char *filter = NULL;
> char *internal = NULL;
> char *devaddr = NULL;
> @@ -6061,6 +6062,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
> txmode = virXMLPropString(cur, "txmode");
> ioeventfd = virXMLPropString(cur, "ioeventfd");
> event_idx = virXMLPropString(cur, "event_idx");
> + queues = virXMLPropString(cur, "queues");
> } else if (xmlStrEqual(cur->name, BAD_CAST "filterref")) {
> if (filter) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> @@ -6351,6 +6353,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
> }
> def->driver.virtio.event_idx = idx;
> }
> + if (queues) {
> + unsigned int q;
> + if (virStrToLong_ui(queues, NULL, 10, &q) < 0) {
Shouldn't this be <= 0 ?
> + virReportError(VIR_ERR_XML_DETAIL,
> + _("'queues' attribute must be unsigned integer: %s"),
I still like "positive number" better, both because it is less
"programmer-ese", and because "unsigned" implies that 0 is okay, but in
this case it isn't.
> + queues);
> + goto error;
> + }
> + def->driver.virtio.queues = q;
> + }
> }
>
> def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT;
> @@ -6404,6 +6416,7 @@ cleanup:
> VIR_FREE(txmode);
> VIR_FREE(ioeventfd);
> VIR_FREE(event_idx);
> + VIR_FREE(queues);
> VIR_FREE(filter);
> VIR_FREE(type);
> VIR_FREE(internal);
> @@ -14425,6 +14438,8 @@ virDomainNetDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, " event_idx='%s'",
> virDomainVirtioEventIdxTypeToString(def->driver.virtio.event_idx));
> }
> + if (def->driver.virtio.queues)
> + virBufferAsprintf(buf, " queues='%u'", def->driver.virtio.queues);
> virBufferAddLit(buf, "/>\n");
> }
> }
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index c176a4c..507dfd8 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -932,6 +932,7 @@ struct _virDomainNetDef {
> enum virDomainNetVirtioTxModeType txmode;
> enum virDomainIoEventFd ioeventfd;
> enum virDomainVirtioEventIdx event_idx;
> + unsigned int queues; /* Multiqueue virtio-net */
> } virtio;
> } driver;
> union {
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml b/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
> new file mode 100644
> index 0000000..76f84f6
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
> @@ -0,0 +1,51 @@
> +<domain type='qemu'>
> + <name>test</name>
> + <uuid>bba65c0e-c049-934f-b6aa-4e2c0582acdf</uuid>
> + <memory unit='KiB'>1048576</memory>
> + <currentMemory unit='KiB'>1048576</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='x86_64' machine='pc-0.13'>hvm</type>
> + <boot dev='cdrom'/>
> + <boot dev='hd'/>
> + <bootmenu enable='yes'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>restart</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu</emulator>
> + <disk type='file' device='disk'>
> + <driver name='qemu' type='qcow2' event_idx='on'/>
> + <source file='/var/lib/libvirt/images/f14.img'/>
> + <target dev='vda' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
> + </disk>
> + <disk type='file' device='cdrom'>
> + <driver name='qemu' type='raw'/>
> + <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
> + <target dev='hdc' bus='ide'/>
> + <readonly/>
> + <address type='drive' controller='0' bus='1' target='0' unit='0'/>
> + </disk>
> + <controller type='usb' index='0'/>
> + <controller type='virtio-serial' index='0'>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
> + </controller>
> + <controller type='ide' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <interface type='user'>
> + <mac address='52:54:00:e5:48:58'/>
> + <model type='virtio'/>
> + <driver name='vhost' queues='5'/>
> + </interface>
> + <serial type='pty'>
> + <target port='0'/>
> + </serial>
> + <console type='pty'>
> + <target type='serial' port='0'/>
> + </console>
> + <memballoon model='virtio'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
> index 148a05a..96f3861 100644
> --- a/tests/qemuxml2xmltest.c
> +++ b/tests/qemuxml2xmltest.c
> @@ -246,6 +246,7 @@ mymain(void)
> DO_TEST("smp");
> DO_TEST("lease");
> DO_TEST("event_idx");
> + DO_TEST("vhost_queues");
> DO_TEST("virtio-lun");
>
> DO_TEST("usb-redir");
ACK with those issues fixed.
More information about the libvir-list
mailing list