
On 21.05.2013 18:37, Laine Stump wrote:
On 05/21/2013 10:18 AM, Michal Privoznik wrote:
In order to learn libvirt multiqueue several things must be done:
1) The '/dev/net/tun' device needs to be opened multiple times with IFF_MULTI_QUEUE flag passed to ioctl(fd, TUNSETIFF, &ifr);
2) Similar, the '/dev/vhost-net' must be opened as many times as in 1)
s/Similar, the/Similarly,/
in order to keep 1:1 ratio recommended by qemu and kernel folks.
3) The command line construction code needs to switch from 'fd=X' to 'fds=X:Y:...:Z' and from 'vhostfd=X' to 'vhostfds=X:Y:...:Z'.
4) The monitor handling code needs to learn to pass multiple FDs. --- src/network/bridge_driver.c | 2 +- src/qemu/qemu_command.c | 260 ++++++++++++++++++++++++++++++-------------- src/qemu/qemu_command.h | 13 ++- src/qemu/qemu_hotplug.c | 98 ++++++++++++----- src/qemu/qemu_monitor.c | 78 +++++++------ src/qemu/qemu_monitor.h | 8 +- src/uml/uml_conf.c | 5 +- src/util/virnetdevtap.c | 113 ++++++++++--------- src/util/virnetdevtap.h | 2 + 9 files changed, 378 insertions(+), 201 deletions(-)
ACK. (I'm undecided if we should error out if multi-queue is requested when running non-privileged, and I don't care enough about the extra braces to require you to add them (and it's not in the official coding style))
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Okay, I squashed this in: diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6011882..6203eec 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -371,7 +371,10 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, goto cleanup; } /* qemuCreateInBridgePortWithHelper can only create a single FD */ - *tapfdSize = 1; + if (*tapfdSize > 1) { + VIR_WARN("Ignoring multiqueue network request"); + *tapfdSize = 1; + } } virDomainAuditNetDevice(def, net, "/dev/net/tun", true); @@ -394,9 +397,9 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, } if (net->filter && net->ifname && - virDomainConfNWFilterInstantiate(conn, def->uuid, net) < 0) + virDomainConfNWFilterInstantiate(conn, def->uuid, net) < 0) { goto cleanup; - + } ret = 0;