qemu: Format mdevs on qemu command line

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@redhat.com>
This commit is contained in:
Erik Skultety 2017-02-03 14:24:14 +01:00
parent c8e6775f30
commit ef18a50bfb
2 changed files with 50 additions and 0 deletions

View File

@ -58,6 +58,7 @@
#include "virscsi.h"
#include "virnuma.h"
#include "virgic.h"
#include "virmdev.h"
#if defined(__linux__)
# include <linux/capability.h>
#endif
@ -5220,6 +5221,31 @@ 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;
char *ret = NULL;
virBufferAddLit(&buf, "vfio-pci");
virBufferAsprintf(&buf, ",sysfsdev=%s",
virMediatedDeviceGetSysfsPath(mdevsrc->uuidstr));
if (qemuBuildDeviceAddressStr(&buf, def, dev->info, qemuCaps) < 0)
goto cleanup;
if (virBufferCheckError(&buf) < 0)
goto cleanup;
ret = virBufferContentAndReset(&buf);
cleanup:
virBufferFreeAndReset(&buf);
return ret;
}
static int
qemuBuildHostdevCommandLine(virCommandPtr cmd,
@ -5408,6 +5434,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;

View File

@ -168,6 +168,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);