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

Martin Kletzander mkletzan at redhat.com
Wed Mar 2 09:30:42 UTC 2022


On Tue, Mar 01, 2022 at 05:21:37PM -0600, Jonathon Jongsma wrote:
>Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2024406
>
>Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
>---
> src/conf/domain_conf.c                        | 11 ++++++
> src/qemu/qemu_domain.c                        |  3 +-
> .../net-vdpa-multiqueue.x86_64-latest.args    | 36 +++++++++++++++++++
> .../qemuxml2argvdata/net-vdpa-multiqueue.xml  | 29 +++++++++++++++
> tests/qemuxml2argvtest.c                      |  1 +
> .../net-vdpa-multiqueue.xml                   | 36 +++++++++++++++++++
> tests/qemuxml2xmltest.c                       |  1 +
> 7 files changed, 116 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/conf/domain_conf.c b/src/conf/domain_conf.c
>index 34fec887a3..87117a2ddb 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -10552,6 +10552,17 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
>             goto error;
>         }
>         def->data.vdpa.devicepath = g_steal_pointer(&dev);
>+
>+        if (!def->model)
>+            def->model = VIR_DOMAIN_NET_MODEL_VIRTIO;
>+
>+        if (!virDomainNetIsVirtioModel(def)) {
>+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>+                           _("Wrong <model> 'type' attribute specified "
>+                             "with <interface type='vdpa'/>. "
>+                             "vdpa requires the virtio-net* frontend"));
>+            goto error;
>+        }

This looks like it belongs to the verification phase as well so that it
does not reject already-existing domain XMLs.

>         break;
>
>     case VIR_DOMAIN_NET_TYPE_BRIDGE:
>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));

Do I get that we cannot support it for <network/> but we do for
<interface/>?  Just asking if I understand it correctly, no need to
change that.

>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..2e38c6f976
>--- /dev/null
>+++ b/tests/qemuxml2argvdata/net-vdpa-multiqueue.xml
>@@ -0,0 +1,29 @@
>+<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'/>
>+      <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
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20220302/e4e2a88e/attachment-0001.sig>


More information about the libvir-list mailing list