On 10/14/20 1:08 PM, Jonathon Jongsma wrote:
Enable <interface type='vdpa'> for qemu domains. This
provides basic
support and does not support hotplug or migration.
Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
src/qemu/qemu_command.c | 35 +++++++++++++++--
src/qemu/qemu_command.h | 3 +-
src/qemu/qemu_domain.c | 6 ++-
src/qemu/qemu_hotplug.c | 14 ++++---
src/qemu/qemu_interface.c | 23 +++++++++++
src/qemu/qemu_interface.h | 2 +
src/qemu/qemu_migration.c | 10 ++++-
src/qemu/qemu_validate.c | 14 +++++++
.../net-vdpa.x86_64-latest.args | 38 +++++++++++++++++++
tests/qemuxml2argvdata/net-vdpa.xml | 28 ++++++++++++++
tests/qemuxml2argvmock.c | 11 +++++-
tests/qemuxml2argvtest.c | 1 +
tests/qemuxml2xmloutdata/net-vdpa.xml | 34 +++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
14 files changed, 206 insertions(+), 14 deletions(-)
create mode 100644 tests/qemuxml2argvdata/net-vdpa.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/net-vdpa.xml
create mode 100644 tests/qemuxml2xmloutdata/net-vdpa.xml
Coverity indicated a possible RESOURCE_LEAK
[...]
@@ -8203,13 +8212,17 @@
qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
break;
+ case VIR_DOMAIN_NET_TYPE_VDPA:
+ if ((vdpafd = qemuInterfaceVDPAConnect(net)) < 0)
+ goto cleanup;
+ break;
+
Between here and where it gets used/consumed, it's possible to jump to
cleanup. Whether it's technically possible based on various tests made,
I'm not 100% sure. The cleanup code would need to account for
VIR_CLOSE_FORCE(vdpafd) if (vdpafd >= 0)...
case VIR_DOMAIN_NET_TYPE_USER:
case VIR_DOMAIN_NET_TYPE_SERVER:
case VIR_DOMAIN_NET_TYPE_CLIENT:
case VIR_DOMAIN_NET_TYPE_MCAST:
case VIR_DOMAIN_NET_TYPE_INTERNAL:
case VIR_DOMAIN_NET_TYPE_UDP:
- case VIR_DOMAIN_NET_TYPE_VDPA:
case VIR_DOMAIN_NET_TYPE_LAST:
/* nada */
break;
@@ -8327,13 +8340,29 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
vhostfd[i] = -1;
}
+ if (vdpafd > 0) {
+ g_autofree char *fdset = NULL;
+ g_autofree char *addfdarg = NULL;
+
+ virCommandPassFD(cmd, vdpafd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
+ fdset = qemuVirCommandGetFDSet(cmd, vdpafd);
+ if (!fdset)
+ goto cleanup;
+ vdpafdName = qemuVirCommandGetDevSet(cmd, vdpafd);
+ /* set opaque to the devicepath so that we can look up the fdset later
+ * if necessary */
+ addfdarg = g_strdup_printf("%s,opaque=%s", fdset,
+ net->data.vdpa.devicepath);
+ virCommandAddArgList(cmd, "-add-fd", addfdarg, NULL);
+ }
+
As long as the above code consumes vdpafd, then just set it to -1 right
after consumption to avoid double cleanup when it is really closed.
John
if (chardev)
virCommandAddArgList(cmd, "-chardev", chardev, NULL);
if (!(hostnetprops = qemuBuildHostNetStr(net,
tapfdName, tapfdSize,
vhostfdName, vhostfdSize,
- slirpfdName)))
+ slirpfdName, vdpafdName)))
goto cleanup;
if (!(host = virQEMUBuildNetdevCommandlineFromJSON(hostnetprops,
[...]