提交 038eb472 编写于 作者: M Michal Privoznik

qemu: Expose rx/tx_queue_size in qemu.conf too

In 2074ef6c and c56cdf25 (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: NMichal Privoznik <mprivozn@redhat.com>
Reviewed-by: NJohn Ferlan <jferlan@redhat.com>
上级 75fd48b9
...@@ -5456,7 +5456,12 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -5456,7 +5456,12 @@ qemu-kvm -net nic,model=? /dev/null
some restrictions on actual value. For instance, latest some restrictions on actual value. For instance, latest
QEMU (as of 2016-09-01) requires value to be a power of two QEMU (as of 2016-09-01) requires value to be a power of two
from [256, 1024] range. 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 <b>In general you should leave this option alone, unless you
are very certain you know what you are doing.</b> are very certain you know what you are doing.</b>
...@@ -5472,7 +5477,12 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -5472,7 +5477,12 @@ qemu-kvm -net nic,model=? /dev/null
range. In addition to that, this may work only for a subset of range. In addition to that, this may work only for a subset of
interface types, e.g. aforementioned QEMU enables this option interface types, e.g. aforementioned QEMU enables this option
only for <code>vhostuser</code> type. 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 <b>In general you should leave this option alone, unless you
are very certain you know what you are doing.</b> are very certain you know what you are doing.</b>
......
...@@ -118,6 +118,9 @@ module Libvirtd_qemu = ...@@ -118,6 +118,9 @@ module Libvirtd_qemu =
let vxhs_entry = bool_entry "vxhs_tls" let vxhs_entry = bool_entry "vxhs_tls"
| str_entry "vxhs_tls_x509_cert_dir" | 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 ... *) (* Each entry in the config is one of the following ... *)
let entry = default_tls_entry let entry = default_tls_entry
| vnc_entry | vnc_entry
...@@ -137,6 +140,7 @@ module Libvirtd_qemu = ...@@ -137,6 +140,7 @@ module Libvirtd_qemu =
| gluster_debug_level_entry | gluster_debug_level_entry
| memory_entry | memory_entry
| vxhs_entry | vxhs_entry
| virtio_entry
let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ] let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
let empty = [ label "#empty" . eol ] let empty = [ label "#empty" . eol ]
......
...@@ -775,3 +775,9 @@ ...@@ -775,3 +775,9 @@
# This directory is used for memoryBacking source if configured as file. # This directory is used for memoryBacking source if configured as file.
# NOTE: big files will be stored here # NOTE: big files will be stored here
#memory_backing_dir = "/var/lib/libvirt/qemu/ram" #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
...@@ -3751,7 +3751,8 @@ qemuBuildNicStr(virDomainNetDefPtr net, ...@@ -3751,7 +3751,8 @@ qemuBuildNicStr(virDomainNetDefPtr net,
char * char *
qemuBuildNicDevStr(virDomainDefPtr def, qemuBuildNicDevStr(virQEMUDriverConfigPtr cfg,
virDomainDefPtr def,
virDomainNetDefPtr net, virDomainNetDefPtr net,
int vlan, int vlan,
unsigned int bootindex, unsigned int bootindex,
...@@ -3871,21 +3872,41 @@ qemuBuildNicDevStr(virDomainDefPtr def, ...@@ -3871,21 +3872,41 @@ qemuBuildNicDevStr(virDomainDefPtr def,
virBufferAsprintf(&buf, ",mq=on,vectors=%zu", 2 * vhostfdSize + 2); virBufferAsprintf(&buf, ",mq=on,vectors=%zu", 2 * vhostfdSize + 2);
} }
} }
if (usingVirtio && net->driver.virtio.rx_queue_size) { if (usingVirtio) {
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_RX_QUEUE_SIZE)) { unsigned int rx_queue_size = net->driver.virtio.rx_queue_size;
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("virtio rx_queue_size option is not supported with this QEMU binary")); if (rx_queue_size == 0)
goto error; 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 (usingVirtio) {
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_TX_QUEUE_SIZE)) { unsigned int tx_queue_size = net->driver.virtio.tx_queue_size;
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("virtio tx_queue_size option is not supported with this QEMU binary")); if (tx_queue_size == 0)
goto error; 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) { if (usingVirtio && net->mtu) {
...@@ -8571,7 +8592,7 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver, ...@@ -8571,7 +8592,7 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver,
virCommandAddArg(cmd, netdev); virCommandAddArg(cmd, netdev);
VIR_FREE(netdev); VIR_FREE(netdev);
if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex, if (!(nic = qemuBuildNicDevStr(cfg, def, net, -1, bootindex,
queues, qemuCaps))) { queues, qemuCaps))) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Error generating NIC -device string")); "%s", _("Error generating NIC -device string"));
...@@ -8608,6 +8629,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, ...@@ -8608,6 +8629,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
int **nicindexes, int **nicindexes,
bool chardevStdioLogd) bool chardevStdioLogd)
{ {
virQEMUDriverConfigPtr cfg = NULL;
int ret = -1; int ret = -1;
char *nic = NULL, *host = NULL; char *nic = NULL, *host = NULL;
int *tapfd = NULL; int *tapfd = NULL;
...@@ -8669,6 +8691,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, ...@@ -8669,6 +8691,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
return -1; return -1;
} }
cfg = virQEMUDriverGetConfig(driver);
switch (actualType) { switch (actualType) {
case VIR_DOMAIN_NET_TYPE_NETWORK: case VIR_DOMAIN_NET_TYPE_NETWORK:
case VIR_DOMAIN_NET_TYPE_BRIDGE: case VIR_DOMAIN_NET_TYPE_BRIDGE:
...@@ -8864,7 +8888,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, ...@@ -8864,7 +8888,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
virCommandAddArgList(cmd, "-netdev", host, NULL); virCommandAddArgList(cmd, "-netdev", host, NULL);
} }
if (qemuDomainSupportsNicdev(def, net)) { if (qemuDomainSupportsNicdev(def, net)) {
if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex, if (!(nic = qemuBuildNicDevStr(cfg, def, net, vlan, bootindex,
vhostfdSize, qemuCaps))) vhostfdSize, qemuCaps)))
goto cleanup; goto cleanup;
virCommandAddArgList(cmd, "-device", nic, NULL); virCommandAddArgList(cmd, "-device", nic, NULL);
...@@ -8908,6 +8932,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, ...@@ -8908,6 +8932,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
VIR_FREE(host); VIR_FREE(host);
VIR_FREE(tapfdName); VIR_FREE(tapfdName);
VIR_FREE(vhostfdName); VIR_FREE(vhostfdName);
virObjectUnref(cfg);
return ret; return ret;
} }
......
...@@ -90,7 +90,8 @@ char *qemuBuildNicStr(virDomainNetDefPtr net, ...@@ -90,7 +90,8 @@ char *qemuBuildNicStr(virDomainNetDefPtr net,
int vlan); int vlan);
/* Current, best practice */ /* Current, best practice */
char *qemuBuildNicDevStr(virDomainDefPtr def, char *qemuBuildNicDevStr(virQEMUDriverConfigPtr cfg,
virDomainDefPtr def,
virDomainNetDefPtr net, virDomainNetDefPtr net,
int vlan, int vlan,
unsigned int bootindex, unsigned int bootindex,
......
...@@ -912,6 +912,10 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, ...@@ -912,6 +912,10 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
if (virConfGetValueString(conf, "memory_backing_dir", &cfg->memoryBackingDir) < 0) if (virConfGetValueString(conf, "memory_backing_dir", &cfg->memoryBackingDir) < 0)
goto cleanup; 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; ret = 0;
cleanup: cleanup:
......
...@@ -206,6 +206,9 @@ struct _virQEMUDriverConfig { ...@@ -206,6 +206,9 @@ struct _virQEMUDriverConfig {
bool vxhsTLS; bool vxhsTLS;
char *vxhsTLSx509certdir; char *vxhsTLSx509certdir;
unsigned int rx_queue_size;
unsigned int tx_queue_size;
}; };
/* Main driver state */ /* Main driver state */
......
...@@ -1120,7 +1120,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, ...@@ -1120,7 +1120,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
for (i = 0; i < vhostfdSize; i++) for (i = 0; i < vhostfdSize; i++)
VIR_FORCE_CLOSE(vhostfd[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))) queueSize, priv->qemuCaps)))
goto try_remove; goto try_remove;
......
...@@ -100,3 +100,5 @@ module Test_libvirtd_qemu = ...@@ -100,3 +100,5 @@ module Test_libvirtd_qemu =
{ "1" = "mount" } { "1" = "mount" }
} }
{ "memory_backing_dir" = "/var/lib/libvirt/qemu/ram" } { "memory_backing_dir" = "/var/lib/libvirt/qemu/ram" }
{ "rx_queue_size" = "1024" }
{ "tx_queue_size" = "1024" }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册