diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 8c12690753664db2e3a7d06bff97b1a99c3c46ee..3a200aa09e3ba0258924aec24ae47fd4bccdd85d 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3265,7 +3265,7 @@ qemu-kvm -net nic,model=? /dev/null
<source network='default'/>
<target dev='vnet1'/>
<model type='virtio'/>
- <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/>
+ <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='5'/>
</interface>
</devices>
...
@@ -3359,6 +3359,16 @@ qemu-kvm -net nic,model=? /dev/null
In general you should leave this option alone, unless you
are very certain you know what you are doing.
+
queues
+
+ The optional queues
attribute controls the number of
+ queues to be used for the
+ Multiqueue virtio-net feature. If the interface has <model
+ type='virtio'/>
, multiple packet processing queues can be
+ created; each queue will potentially be handled by a different
+ processor, resulting in much higher throughput.
+ Since 1.0.6 (QEMU and KVM only)
+
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 939654f4eac8badf7cfc0c5ba58dfaabf25b9cc0..3cace351a669447ece6b6a601e050eecbddb5513 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2012,6 +2012,11 @@
+
+
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 746f0d061cd9b078d1f00afd1c386927c21cb1f8..ae9c0a4c3ae315e427945a2bb7d1444e50d2dd20 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6001,6 +6001,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;
@@ -6112,6 +6113,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",
@@ -6402,6 +6404,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 positive number: %s"),
+ queues);
+ goto error;
+ }
+ def->driver.virtio.queues = q;
+ }
}
def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT;
@@ -6455,6 +6467,7 @@ cleanup:
VIR_FREE(txmode);
VIR_FREE(ioeventfd);
VIR_FREE(event_idx);
+ VIR_FREE(queues);
VIR_FREE(filter);
VIR_FREE(type);
VIR_FREE(internal);
@@ -14497,6 +14510,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 f9f3994fbc61a55f31b0ae32dc30bec7160ee9d9..3a71d6c8f57b9c019ba76c6fc35c18f76c22960e 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -934,6 +934,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 0000000000000000000000000000000000000000..76f84f622c1e57372be0c4d99694357cc7a4680d
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml
@@ -0,0 +1,51 @@
+
+ test
+ bba65c0e-c049-934f-b6aa-4e2c0582acdf
+ 1048576
+ 1048576
+ 1
+
+ hvm
+
+
+
+
+
+ destroy
+ restart
+ restart
+
+ /usr/bin/qemu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index fde6fa373c2b8a2379aaea8ca2d2dd9fb77eaff6..64a271cb7a3dc1d3b0c20fbe10d0387742aaa524 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");