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 | 11 ++++-
docs/schemas/domaincommon.rng | 5 +++
src/conf/domain_conf.c | 15 +++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_domain.c | 27 +++++++-----
tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 2 +-
.../qemuxml2argv-net-virtio-device.xml | 2 +-
.../qemuxml2argvdata/qemuxml2argv-vhost_queues.xml | 50 ++++++++++++++++++++++
tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml | 2 +-
tests/qemuxml2xmltest.c | 1 +
10 files changed, 102 insertions(+), 14 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 888c005..34454e5 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3070,7 +3070,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>
@@ -3151,6 +3151,15 @@ 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">M
+ ultiqueue virtio-net</a> feature. Long story short, in case of a
+ virtio net device, multiple queues can be created so each queue is
+ handled by different processor resulting in much higher throughput.
+ <span class="since">Since 1.0.5 (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 3976b82..8d02e6d 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1932,6 +1932,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 dc0ecaa..4b2f84a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -5691,6 +5691,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;
@@ -5802,6 +5803,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",
@@ -6092,6 +6094,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
}
def->driver.virtio.event_idx = idx;
}
+ if (queues) {
+ unsigned int q;
+ if (virStrToLong_ui(queues, NULL, 10, &q) < 0) {
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("'queues' attribute must be unsigned
integer: %s"),
+ queues);
+ goto error;
+ }
+ def->driver.virtio.queues = q;
+ }
}
def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT;
@@ -6145,6 +6157,7 @@ cleanup:
VIR_FREE(txmode);
VIR_FREE(ioeventfd);
VIR_FREE(event_idx);
+ VIR_FREE(queues);
VIR_FREE(filter);
VIR_FREE(type);
VIR_FREE(internal);
@@ -13967,6 +13980,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 f1f01fa..72c4567 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -887,6 +887,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/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a7aabdf..a7f4d44 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -687,17 +687,24 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
virQEMUDriverPtr driver = opaque;
virQEMUDriverConfigPtr cfg = NULL;
- if (dev->type == VIR_DOMAIN_DEVICE_NET &&
- dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
- !dev->data.net->model) {
- if (def->os.arch == VIR_ARCH_S390 ||
- def->os.arch == VIR_ARCH_S390X)
- dev->data.net->model = strdup("virtio");
- else
- dev->data.net->model = strdup("rtl8139");
+ if (dev->type == VIR_DOMAIN_DEVICE_NET) {
+ if (dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
+ !dev->data.net->model) {
+ if (def->os.arch == VIR_ARCH_S390 ||
+ def->os.arch == VIR_ARCH_S390X)
+ dev->data.net->model = strdup("virtio");
+ else
+ dev->data.net->model = strdup("rtl8139");
+
+ if (!dev->data.net->model)
+ goto no_memory;
+ }
- if (!dev->data.net->model)
- goto no_memory;
+ if (STREQ(dev->data.net->model, "virtio") &&
+ dev->data.net->driver.virtio.queues == 0) {
+ /* default number of queues for multiqueue NIC */
+ dev->data.net->driver.virtio.queues = 1;
+ }
}
/* set default disk types and drivers */
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml
b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml
index 22e388f..f06e96e 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml
@@ -37,7 +37,7 @@
<interface type='user'>
<mac address='52:54:00:e5:48:58'/>
<model type='virtio'/>
- <driver name='vhost' event_idx='off'/>
+ <driver name='vhost' event_idx='off' queues='1'/>
</interface>
<serial type='pty'>
<target port='0'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml
b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml
index 9b37f2f..9f2293f 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml
@@ -24,7 +24,7 @@
<interface type='user'>
<mac address='00:11:22:33:44:55'/>
<model type='virtio'/>
- <driver txmode='iothread'/>
+ <driver txmode='iothread' queues='1'/>
</interface>
<memballoon model='virtio'/>
</devices>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
b/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
new file mode 100644
index 0000000..ae3cd69
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
@@ -0,0 +1,50 @@
+<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'/>
+ <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/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml
b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml
index c4f0079..9484141 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml
@@ -36,7 +36,7 @@
<interface type='user'>
<mac address='52:54:00:e5:48:58'/>
<model type='virtio'/>
- <driver name='vhost' event_idx='off'/>
+ <driver name='vhost' event_idx='off' queues='1'/>
</interface>
<serial type='pty'>
<target port='0'/>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 7434190..dd2b28a 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -241,6 +241,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");
--
1.8.1.5