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) +
Overriding the target element
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");