diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 72ad54cee1..0478cb2c04 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -4254,13 +4254,16 @@ qemu-kvm -net nic,model=? /dev/null
queues
- The optional queues attribute controls the number of - queues to be used for the - Multiqueue virtio-net feature. If the interface has <model - type='virtio'/>, multiple packet processing queues can be - created; each queue will potentially be handled by a different + The optional queues attribute controls the number + of queues to be used for either + Multiqueue + virtio-net or vhost-user network + interfaces. Use of multiple packet processing queues requires the + interface having the <model type='virtio'/> + element. Each queue will potentially be handled by a different processor, resulting in much higher throughput. - Since 1.0.6 (QEMU and KVM only) + virtio-net since 1.0.6 (QEMU and KVM only) + vhost-user since 1.2.17 (QEMU and KVM only)
host offloading options
@@ -4581,9 +4584,15 @@ qemu-kvm -net nic,model=? /dev/null <devices> <interface type='vhostuser'> <mac address='52:54:00:3b:83:1a'/> - <source type='unix' path='/tmp/vhost.sock' mode='server'/> + <source type='unix' path='/tmp/vhost1.sock' mode='server'/> <model type='virtio'/> </interface> + <interface type='vhostuser'> + <mac address='52:54:00:3b:83:1b'/> + <source type='unix' path='/tmp/vhost2.sock' mode='client'/> + <model type='virtio'/> + <driver queues='5'/> + </interface> </devices> ... diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0a6d92f3cb..688b18059a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8102,6 +8102,7 @@ qemuBuildVhostuserCommandLine(virCommandPtr cmd, { virBuffer chardev_buf = VIR_BUFFER_INITIALIZER; virBuffer netdev_buf = VIR_BUFFER_INITIALIZER; + unsigned int queues = net->driver.virtio.queues; char *nic = NULL; if (!qemuDomainSupportsNetdev(def, qemuCaps, net)) { @@ -8139,13 +8140,24 @@ qemuBuildVhostuserCommandLine(virCommandPtr cmd, virBufferAsprintf(&netdev_buf, "type=vhost-user,id=host%s,chardev=char%s", net->info.alias, net->info.alias); + if (queues > 1) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQ)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("multi-queue is not supported for vhost-user " + "with this QEMU binary")); + goto error; + } + virBufferAsprintf(&netdev_buf, ",queues=%u", queues); + } + virCommandAddArg(cmd, "-chardev"); virCommandAddArgBuffer(cmd, &chardev_buf); virCommandAddArg(cmd, "-netdev"); virCommandAddArgBuffer(cmd, &netdev_buf); - if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex, 0, qemuCaps))) { + if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex, + queues, qemuCaps))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Error generating NIC -device string")); goto error; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args new file mode 100644 index 0000000000..8affb53b39 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args @@ -0,0 +1,16 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu -S -M \ +pc -m 214 -smp 1 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-no-acpi -boot c -usb -hda /dev/HostVG/QEMUGuest1 \ +-chardev socket,id=charnet0,path=/tmp/vhost0.sock,server \ +-netdev type=vhost-user,id=hostnet0,chardev=charnet0 \ +-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:ee:96:6b,bus=pci.0,addr=0x3 \ +-chardev socket,id=charnet1,path=/tmp/vhost1.sock \ +-netdev type=vhost-user,id=hostnet1,chardev=charnet1 \ +-device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:ee:96:6c,bus=pci.0,addr=0x4 \ +-netdev socket,listen=:2015,id=hostnet2 \ +-device rtl8139,netdev=hostnet2,id=net2,mac=52:54:00:95:db:c0,bus=pci.0,addr=0x5 \ +-chardev socket,id=charnet3,path=/tmp/vhost2.sock \ +-netdev type=vhost-user,id=hostnet3,chardev=charnet3,queues=4 \ +-device virtio-net-pci,mq=on,vectors=10,netdev=hostnet3,id=net3,mac=52:54:00:ee:96:6d,\ +bus=pci.0,addr=0x6 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml new file mode 100644 index 0000000000..422fa92051 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml @@ -0,0 +1,49 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 0084f46b36..35bfd290f0 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -980,6 +980,9 @@ mymain(void) DO_TEST("misc-uuid", QEMU_CAPS_NAME, QEMU_CAPS_UUID); DO_TEST_PARSE_ERROR("vhost_queues-invalid", NONE); DO_TEST("net-vhostuser", QEMU_CAPS_DEVICE, QEMU_CAPS_NETDEV); + DO_TEST("net-vhostuser-multiq", + QEMU_CAPS_DEVICE, QEMU_CAPS_NETDEV, QEMU_CAPS_VHOSTUSER_MULTIQ); + DO_TEST_FAILURE("net-vhostuser-multiq", QEMU_CAPS_DEVICE, QEMU_CAPS_NETDEV); DO_TEST("net-user", NONE); DO_TEST("net-virtio", NONE); DO_TEST("net-virtio-device",