Format the mediated devices on the qemu command line as
-device vfio-pci,sysfsdev='/path/to/device/in/syfs'.
Signed-off-by: Erik Skultety <eskultet(a)redhat.com>
---
src/qemu/qemu_command.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_command.h | 5 +++++
2 files changed, 54 insertions(+)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index f4bcfd4..0532156 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -57,6 +57,7 @@
#include "virscsi.h"
#include "virnuma.h"
#include "virgic.h"
+#include "virmdev.h"
#if defined(__linux__)
# include <linux/capability.h>
#endif
@@ -5161,6 +5162,35 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
return ret;
}
+char *
+qemuBuildHostdevMediatedDevStr(const virDomainDef *def,
+ virDomainHostdevDefPtr dev,
+ virQEMUCapsPtr qemuCaps)
+{
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ virDomainHostdevSubsysMediatedDevPtr mdevsrc = &dev->source.subsys.u.mdev;
+ virMediatedDevicePtr mdev = NULL;
+ char *ret = NULL;
+
+ if (!(mdev = virMediatedDeviceNew(mdevsrc->uuidstr)))
+ goto cleanup;
+
+ virBufferAddLit(&buf, "vfio-pci");
+ virBufferAsprintf(&buf, ",sysfsdev=%s",
virMediatedDeviceGetPath(mdev));
+
+ if (qemuBuildDeviceAddressStr(&buf, def, dev->info, qemuCaps) < 0)
+ goto cleanup;
+
+ if (virBufferCheckError(&buf) < 0)
+ goto cleanup;
+
+ ret = virBufferContentAndReset(&buf);
+
+ cleanup:
+ virBufferFreeAndReset(&buf);
+ virMediatedDeviceFree(mdev);
+ return ret;
+}
static int
qemuBuildHostdevCommandLine(virCommandPtr cmd,
@@ -5349,6 +5379,25 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
VIR_FREE(devstr);
}
}
+
+ /* MDEV */
+ if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+ subsys->type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV) {
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("VFIO PCI device assignment is not "
+ "supported by this version of qemu"));
+ return -1;
+ }
+
+ virCommandAddArg(cmd, "-device");
+ if (!(devstr =
+ qemuBuildHostdevMediatedDevStr(def, hostdev, qemuCaps)))
+ return -1;
+ virCommandAddArg(cmd, devstr);
+ VIR_FREE(devstr);
+ }
}
return 0;
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 69fe846..b263b87 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -171,6 +171,11 @@ qemuBuildSCSIVHostHostdevDevStr(const virDomainDef *def,
virQEMUCapsPtr qemuCaps,
char *vhostfdName);
+char *
+qemuBuildHostdevMediatedDevStr(const virDomainDef *def,
+ virDomainHostdevDefPtr dev,
+ virQEMUCapsPtr qemuCaps);
+
char *qemuBuildRedirdevDevStr(const virDomainDef *def,
virDomainRedirdevDefPtr dev,
virQEMUCapsPtr qemuCaps);
--
2.10.2