mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
qemu: Expose rx/tx_queue_size in qemu.conf too
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>
This commit is contained in:
parent
75fd48b945
commit
038eb472a0
@ -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" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user