]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Expose rx/tx_queue_size in qemu.conf too
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 19 Jan 2018 10:34:54 +0000 (11:34 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 2 Feb 2018 06:09:22 +0000 (07:09 +0100)
In 2074ef6cd4a2 and c56cdf259 (and friends) we've added two
attributes to virtio NICs: rx_queue_size and tx_queue_size.
However, sysadmins might want to set these on per-host basis but
don't necessarily have an access to domain XML (e.g. because they
are generated by some other app). So let's expose them under
qemu.conf (the settings from domain XML still take precedence as
they are more specific ones).

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
docs/formatdomain.html.in
src/qemu/libvirtd_qemu.aug
src/qemu/qemu.conf
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_hotplug.c
src/qemu/test_libvirtd_qemu.aug.in

index 3ec1173c6fafbf1b676199e3538d541076922627..6707744bda456604f2db8f9893c20160b87e0913 100644 (file)
@@ -5456,7 +5456,12 @@ qemu-kvm -net nic,model=? /dev/null
         some restrictions on actual value. For instance, latest
         QEMU (as of 2016-09-01) requires value to be a power of two
         from [256, 1024] range.
-        <span class="since">Since 2.3.0 (QEMU and KVM only)</span><br/><br/>
+        <span class="since">Since 2.3.0 (QEMU and KVM only)</span>
+        Additionally, <span class="since">since 4.1.0</span> the
+        value can be set in the <code>qemu.conf</code> file in order
+        to override the hypervisor default value. Note that XML has
+        higher precedence because it's more specific.
+        <br/><br/>
 
         <b>In general you should leave this option alone, unless you
         are very certain you know what you are doing.</b>
@@ -5472,7 +5477,12 @@ qemu-kvm -net nic,model=? /dev/null
         range. In addition to that, this may work only for a subset of
         interface types, e.g. aforementioned QEMU enables this option
         only for <code>vhostuser</code> type.
-        <span class="since">Since 3.7.0 (QEMU and KVM only)</span><br/><br/>
+        <span class="since">Since 3.7.0 (QEMU and KVM only)</span>
+        Additionally, <span class="since">since 4.1.0</span> the
+        value can be set in the <code>qemu.conf</code> file in order
+        to override the hypervisor default value. Note that XML has
+        higher precedence because it's more specific.
+        <br/><br/>
 
         <b>In general you should leave this option alone, unless you
         are very certain you know what you are doing.</b>
index c19bf3a43ace747a89f708d25bc6ee8422faf6ea..084290296abc1ecb817f08ca3e0daf424932c276 100644 (file)
@@ -118,6 +118,9 @@ module Libvirtd_qemu =
    let vxhs_entry = bool_entry "vxhs_tls"
                  | str_entry "vxhs_tls_x509_cert_dir"
 
+   let virtio_entry = int_entry "rx_queue_size"
+                 | int_entry "tx_queue_size"
+
    (* Each entry in the config is one of the following ... *)
    let entry = default_tls_entry
              | vnc_entry
@@ -137,6 +140,7 @@ module Libvirtd_qemu =
              | gluster_debug_level_entry
              | memory_entry
              | vxhs_entry
+             | virtio_entry
 
    let comment = [ label "#comment" . del /#[ \t]*/ "# " .  store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
    let empty = [ label "#empty" . eol ]
index 43dd561cca90114b86e0cdd036c34d6a1dba6ef2..62c4265ea95a3aa80c366ab2d1cf9c87e7867343 100644 (file)
 # This directory is used for memoryBacking source if configured as file.
 # NOTE: big files will be stored here
 #memory_backing_dir = "/var/lib/libvirt/qemu/ram"
+
+# The following two values set the default RX/TX ring buffer size for virtio
+# interfaces. These values are taken unless overridden in domain XML. For more
+# info consult docs to corresponding attributes from domain XML.
+#rx_queue_size = 1024
+#tx_queue_size = 1024
index 899f0cbbbff2a38cd5d896add85622100b792378..543270028754ba5c0d0e330cb9193f95b63491db 100644 (file)
@@ -3751,7 +3751,8 @@ qemuBuildNicStr(virDomainNetDefPtr net,
 
 
 char *
-qemuBuildNicDevStr(virDomainDefPtr def,
+qemuBuildNicDevStr(virQEMUDriverConfigPtr cfg,
+                   virDomainDefPtr def,
                    virDomainNetDefPtr net,
                    int vlan,
                    unsigned int bootindex,
@@ -3871,21 +3872,41 @@ qemuBuildNicDevStr(virDomainDefPtr def,
             virBufferAsprintf(&buf, ",mq=on,vectors=%zu", 2 * vhostfdSize + 2);
         }
     }
-    if (usingVirtio && net->driver.virtio.rx_queue_size) {
-        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_RX_QUEUE_SIZE)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("virtio rx_queue_size option is not supported with this QEMU binary"));
-            goto error;
+    if (usingVirtio) {
+        unsigned int rx_queue_size = net->driver.virtio.rx_queue_size;
+
+        if (rx_queue_size == 0)
+            rx_queue_size = cfg->rx_queue_size;
+
+        if (rx_queue_size) {
+            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_RX_QUEUE_SIZE)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("virtio rx_queue_size option is "
+                                 "not supported with this QEMU binary"));
+                goto error;
+            }
+
+            net->driver.virtio.rx_queue_size = rx_queue_size;
+            virBufferAsprintf(&buf, ",rx_queue_size=%u", rx_queue_size);
         }
-        virBufferAsprintf(&buf, ",rx_queue_size=%u", net->driver.virtio.rx_queue_size);
     }
-    if (usingVirtio && net->driver.virtio.tx_queue_size) {
-        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_TX_QUEUE_SIZE)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("virtio tx_queue_size option is not supported with this QEMU binary"));
-            goto error;
+    if (usingVirtio) {
+        unsigned int tx_queue_size = net->driver.virtio.tx_queue_size;
+
+        if (tx_queue_size == 0)
+            tx_queue_size = cfg->tx_queue_size;
+
+        if (tx_queue_size) {
+            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_TX_QUEUE_SIZE)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("virtio tx_queue_size option is "
+                                 "not supported with this QEMU binary"));
+                goto error;
+            }
+
+            net->driver.virtio.tx_queue_size = tx_queue_size;
+            virBufferAsprintf(&buf, ",tx_queue_size=%u", tx_queue_size);
         }
-        virBufferAsprintf(&buf, ",tx_queue_size=%u", net->driver.virtio.tx_queue_size);
     }
 
     if (usingVirtio && net->mtu) {
@@ -8571,7 +8592,7 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver,
     virCommandAddArg(cmd, netdev);
     VIR_FREE(netdev);
 
-    if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex,
+    if (!(nic = qemuBuildNicDevStr(cfg, def, net, -1, bootindex,
                                    queues, qemuCaps))) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        "%s", _("Error generating NIC -device string"));
@@ -8608,6 +8629,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
                               int **nicindexes,
                               bool chardevStdioLogd)
 {
+    virQEMUDriverConfigPtr cfg = NULL;
     int ret = -1;
     char *nic = NULL, *host = NULL;
     int *tapfd = NULL;
@@ -8669,6 +8691,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
         return -1;
     }
 
+    cfg = virQEMUDriverGetConfig(driver);
+
     switch (actualType) {
     case VIR_DOMAIN_NET_TYPE_NETWORK:
     case VIR_DOMAIN_NET_TYPE_BRIDGE:
@@ -8864,7 +8888,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
         virCommandAddArgList(cmd, "-netdev", host, NULL);
     }
     if (qemuDomainSupportsNicdev(def, net)) {
-        if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex,
+        if (!(nic = qemuBuildNicDevStr(cfg, def, net, vlan, bootindex,
                                        vhostfdSize, qemuCaps)))
             goto cleanup;
         virCommandAddArgList(cmd, "-device", nic, NULL);
@@ -8908,6 +8932,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
     VIR_FREE(host);
     VIR_FREE(tapfdName);
     VIR_FREE(vhostfdName);
+    virObjectUnref(cfg);
     return ret;
 }
 
index 31c9da673ca4f4d4bcb580b4370d27f974b2c448..6449883291e6d78d529e14491ff4fd704cbe83dd 100644 (file)
@@ -90,7 +90,8 @@ char *qemuBuildNicStr(virDomainNetDefPtr net,
                       int vlan);
 
 /* Current, best practice */
-char *qemuBuildNicDevStr(virDomainDefPtr def,
+char *qemuBuildNicDevStr(virQEMUDriverConfigPtr cfg,
+                         virDomainDefPtr def,
                          virDomainNetDefPtr net,
                          int vlan,
                          unsigned int bootindex,
index af503d31cbd65a7096c2102bf017b5c2d963d836..2fa96431fad1fbd8f2613f2cfc023ede12578743 100644 (file)
@@ -912,6 +912,10 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
     if (virConfGetValueString(conf, "memory_backing_dir", &cfg->memoryBackingDir) < 0)
         goto cleanup;
 
+    if (virConfGetValueUInt(conf, "rx_queue_size", &cfg->rx_queue_size) < 0 ||
+        virConfGetValueUInt(conf, "tx_queue_size", &cfg->tx_queue_size) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
index a553e30e2ebf18ba53b924dc1773de225476fe18..3f38a76c2699328a20aafdc14b2f68aa057bcc60 100644 (file)
@@ -206,6 +206,9 @@ struct _virQEMUDriverConfig {
 
     bool vxhsTLS;
     char *vxhsTLSx509certdir;
+
+    unsigned int rx_queue_size;
+    unsigned int tx_queue_size;
 };
 
 /* Main driver state */
index 5be3e0659ad749e7e8a3585f6b98e2f218f34059..a8979db2e8f1dd90325e52b865331072ec959d7d 100644 (file)
@@ -1120,7 +1120,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
     for (i = 0; i < vhostfdSize; i++)
         VIR_FORCE_CLOSE(vhostfd[i]);
 
-    if (!(nicstr = qemuBuildNicDevStr(vm->def, net, vlan, 0,
+    if (!(nicstr = qemuBuildNicDevStr(cfg, vm->def, net, vlan, 0,
                                       queueSize, priv->qemuCaps)))
         goto try_remove;
 
index 688e5b9fda3552fa37ee33c65b2f8f063b81f0ea..4fc4e2f4ecc44ef849569f99d0745bd141969b77 100644 (file)
@@ -100,3 +100,5 @@ module Test_libvirtd_qemu =
     { "1" = "mount" }
 }
 { "memory_backing_dir" = "/var/lib/libvirt/qemu/ram" }
+{ "rx_queue_size" = "1024" }
+{ "tx_queue_size" = "1024" }