[libvirt PATCH v3] qemu: support multiqueue for vdpa net device

Jonathon Jongsma posted 1 patch 2 years, 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20220308172552.167511-1-jjongsma@redhat.com
Test syntax-check failed
src/qemu/qemu_domain.c                        |  3 +-
.../net-vdpa-multiqueue.x86_64-latest.args    | 36 +++++++++++++++++++
.../qemuxml2argvdata/net-vdpa-multiqueue.xml  | 30 ++++++++++++++++
tests/qemuxml2argvtest.c                      |  1 +
.../net-vdpa-multiqueue.xml                   | 36 +++++++++++++++++++
tests/qemuxml2xmltest.c                       |  1 +
6 files changed, 106 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/net-vdpa-multiqueue.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/net-vdpa-multiqueue.xml
create mode 100644 tests/qemuxml2xmloutdata/net-vdpa-multiqueue.xml
[libvirt PATCH v3] qemu: support multiqueue for vdpa net device
Posted by Jonathon Jongsma 2 years, 1 month ago
The vdpa device supports multiqueue, so remove the restriction from
qemuDomainValidateActualNetDef() that prevents us from using this
functionality.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2024406

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
---
Changes in v3:
 - Do not set the model type in virDomainNetDefParseXML(). Other virtio devices
   require the model to be explicitly set to 'virtio' in the xml definition in
   order to parse the virtio driver options, and it doesn't make sense to treat
   the vdpa device differently. If we want this behavior to change, it should
   probably be changed so that it applies to all devices that default to a
   virtio device model.

Changes in v2:
 - remove error message in virDomainNetDefParseXML(). The model is already
   checked in the post parse validation step.

 src/qemu/qemu_domain.c                        |  3 +-
 .../net-vdpa-multiqueue.x86_64-latest.args    | 36 +++++++++++++++++++
 .../qemuxml2argvdata/net-vdpa-multiqueue.xml  | 30 ++++++++++++++++
 tests/qemuxml2argvtest.c                      |  1 +
 .../net-vdpa-multiqueue.xml                   | 36 +++++++++++++++++++
 tests/qemuxml2xmltest.c                       |  1 +
 6 files changed, 106 insertions(+), 1 deletion(-)
 create mode 100644 tests/qemuxml2argvdata/net-vdpa-multiqueue.x86_64-latest.args
 create mode 100644 tests/qemuxml2argvdata/net-vdpa-multiqueue.xml
 create mode 100644 tests/qemuxml2xmloutdata/net-vdpa-multiqueue.xml

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index acc76c1cd6..6b61fefb8f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4523,7 +4523,8 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
               actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
               actualType == VIR_DOMAIN_NET_TYPE_DIRECT ||
               actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
-              actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)) {
+              actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER ||
+              actualType == VIR_DOMAIN_NET_TYPE_VDPA)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("interface %s - multiqueue is not supported for network interfaces of type %s"),
                            macstr, virDomainNetTypeToString(actualType));
diff --git a/tests/qemuxml2argvdata/net-vdpa-multiqueue.x86_64-latest.args b/tests/qemuxml2argvdata/net-vdpa-multiqueue.x86_64-latest.args
new file mode 100644
index 0000000000..26ef666036
--- /dev/null
+++ b/tests/qemuxml2argvdata/net-vdpa-multiqueue.x86_64-latest.args
@@ -0,0 +1,36 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \
+-accel tcg \
+-cpu qemu64 \
+-m 214 \
+-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
+-add-fd set=0,fd=1732,opaque=net0-vdpa \
+-netdev vhost-vdpa,vhostdev=/dev/fdset/0,id=hostnet0 \
+-device '{"driver":"virtio-net-pci","mq":true,"vectors":6,"netdev":"hostnet0","id":"net0","mac":"52:54:00:95:db:c0","bus":"pci.0","addr":"0x2"}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/net-vdpa-multiqueue.xml b/tests/qemuxml2argvdata/net-vdpa-multiqueue.xml
new file mode 100644
index 0000000000..6e369c1916
--- /dev/null
+++ b/tests/qemuxml2argvdata/net-vdpa-multiqueue.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0'/>
+    <controller type='ide' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <interface type='vdpa'>
+      <mac address='52:54:00:95:db:c0'/>
+      <source dev='/dev/vhost-vdpa-0'/>
+      <model type='virtio'/>
+      <driver queues='2'/>
+    </interface>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index ce475df466..7e1167e60e 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1609,6 +1609,7 @@ mymain(void)
     DO_TEST_FAILURE("net-hostdev-fail",
                     QEMU_CAPS_DEVICE_VFIO_PCI);
     DO_TEST_CAPS_LATEST("net-vdpa");
+    DO_TEST_CAPS_LATEST("net-vdpa-multiqueue");
 
     DO_TEST("hostdev-pci-multifunction",
             QEMU_CAPS_KVM,
diff --git a/tests/qemuxml2xmloutdata/net-vdpa-multiqueue.xml b/tests/qemuxml2xmloutdata/net-vdpa-multiqueue.xml
new file mode 100644
index 0000000000..0876d5df62
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/net-vdpa-multiqueue.xml
@@ -0,0 +1,36 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='ide' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <interface type='vdpa'>
+      <mac address='52:54:00:95:db:c0'/>
+      <source dev='/dev/vhost-vdpa-0'/>
+      <model type='virtio'/>
+      <driver queues='2'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </interface>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <audio id='1' type='none'/>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 052950b86f..2174965784 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -485,6 +485,7 @@ mymain(void)
     DO_TEST_NOCAPS("net-coalesce");
     DO_TEST_NOCAPS("net-many-models");
     DO_TEST("net-vdpa", QEMU_CAPS_NETDEV_VHOST_VDPA);
+    DO_TEST("net-vdpa-multiqueue", QEMU_CAPS_NETDEV_VHOST_VDPA);
 
     DO_TEST_NOCAPS("serial-tcp-tlsx509-chardev");
     DO_TEST_NOCAPS("serial-tcp-tlsx509-chardev-notls");
-- 
2.35.1
Re: [libvirt PATCH v3] qemu: support multiqueue for vdpa net device
Posted by Martin Kletzander 2 years, 1 month ago
On Tue, Mar 08, 2022 at 11:25:52AM -0600, Jonathon Jongsma wrote:
>The vdpa device supports multiqueue, so remove the restriction from
>qemuDomainValidateActualNetDef() that prevents us from using this
>functionality.
>
>Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2024406
>
>Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
>---
>Changes in v3:
> - Do not set the model type in virDomainNetDefParseXML(). Other virtio devices
>   require the model to be explicitly set to 'virtio' in the xml definition in
>   order to parse the virtio driver options, and it doesn't make sense to treat
>   the vdpa device differently. If we want this behavior to change, it should
>   probably be changed so that it applies to all devices that default to a
>   virtio device model.
>
>Changes in v2:
> - remove error message in virDomainNetDefParseXML(). The model is already
>   checked in the post parse validation step.
>
> src/qemu/qemu_domain.c                        |  3 +-
> .../net-vdpa-multiqueue.x86_64-latest.args    | 36 +++++++++++++++++++
> .../qemuxml2argvdata/net-vdpa-multiqueue.xml  | 30 ++++++++++++++++
> tests/qemuxml2argvtest.c                      |  1 +
> .../net-vdpa-multiqueue.xml                   | 36 +++++++++++++++++++
> tests/qemuxml2xmltest.c                       |  1 +
> 6 files changed, 106 insertions(+), 1 deletion(-)
> create mode 100644 tests/qemuxml2argvdata/net-vdpa-multiqueue.x86_64-latest.args
> create mode 100644 tests/qemuxml2argvdata/net-vdpa-multiqueue.xml
> create mode 100644 tests/qemuxml2xmloutdata/net-vdpa-multiqueue.xml
>

The XMLs could be identical with the output one being a symlink to the
input one, but that's nitpicking and/or can be done later.

>diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>index acc76c1cd6..6b61fefb8f 100644
>--- a/src/qemu/qemu_domain.c
>+++ b/src/qemu/qemu_domain.c
>@@ -4523,7 +4523,8 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
>               actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>               actualType == VIR_DOMAIN_NET_TYPE_DIRECT ||
>               actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
>-              actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)) {
>+              actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER ||
>+              actualType == VIR_DOMAIN_NET_TYPE_VDPA)) {
>             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                            _("interface %s - multiqueue is not supported for network interfaces of type %s"),
>                            macstr, virDomainNetTypeToString(actualType));

Also the comment on top of this condition could be changed to account
for the change, but it was already invalid before, so... =)

Anyway, thanks for the patience with my reviews.

Reviewed-by: Martin Kletzander <mkletzan@redhat.com>