]> xenbits.xensource.com Git - libvirt.git/commitdiff
Introduce /domain/devices/interface/driver/@queues attribute
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 10 Apr 2013 10:19:37 +0000 (12:19 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 22 May 2013 14:31:27 +0000 (16:31 +0200)
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
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
tests/qemuxml2argvdata/qemuxml2argv-vhost_queues.xml [new file with mode: 0644]
tests/qemuxml2xmltest.c

index 8c12690753664db2e3a7d06bff97b1a99c3c46ee..3a200aa09e3ba0258924aec24ae47fd4bccdd85d 100644 (file)
@@ -3265,7 +3265,7 @@ qemu-kvm -net nic,model=? /dev/null
       &lt;source network='default'/&gt;
       &lt;target dev='vnet1'/&gt;
       &lt;model type='virtio'/&gt;
-      <b>&lt;driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/&gt;</b>
+      <b>&lt;driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='5'/&gt;</b>
     &lt;/interface&gt;
   &lt;/devices&gt;
   ...</pre>
@@ -3359,6 +3359,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 the number of
+        queues to be used for the<a href="http://www.linux-kvm.org/page/Multiqueue">
+        Multiqueue virtio-net</a> feature. If the interface has <code>&lt;model
+        type='virtio'/&gt;</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>
index 939654f4eac8badf7cfc0c5ba58dfaabf25b9cc0..3cace351a669447ece6b6a601e050eecbddb5513 100644 (file)
                   </choice>
                 </attribute>
               </optional>
+              <optional>
+                <attribute name='queues'>
+                  <ref name="positiveInteger"/>
+                </attribute>
+              </optional>
               <optional>
                 <attribute name="txmode">
                   <choice>
index 746f0d061cd9b078d1f00afd1c386927c21cb1f8..ae9c0a4c3ae315e427945a2bb7d1444e50d2dd20 100644 (file)
@@ -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");
         }
     }
index f9f3994fbc61a55f31b0ae32dc30bec7160ee9d9..3a71d6c8f57b9c019ba76c6fc35c18f76c22960e 100644 (file)
@@ -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 (file)
index 0000000..76f84f6
--- /dev/null
@@ -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>
index fde6fa373c2b8a2379aaea8ca2d2dd9fb77eaff6..64a271cb7a3dc1d3b0c20fbe10d0387742aaa524 100644 (file)
@@ -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");