提交 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
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>
......
......@@ -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 ]
......
......@@ -775,3 +775,9 @@
# 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
......@@ -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;
}
......
......@@ -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,
......
......@@ -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:
......
......@@ -206,6 +206,9 @@ struct _virQEMUDriverConfig {
bool vxhsTLS;
char *vxhsTLSx509certdir;
unsigned int rx_queue_size;
unsigned int tx_queue_size;
};
/* Main driver state */
......
......@@ -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;
......
......@@ -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" }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册