[libvirt] [PATCH v4 12/14] qemu: Format mdevs on qemu command line
Laine Stump
laine at laine.org
Sun Mar 26 19:04:41 UTC 2017
On 03/22/2017 11:27 AM, Erik Skultety wrote:
> 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 at redhat.com>
> ---
> src/qemu/qemu_command.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_command.h | 5 +++++
> 2 files changed, 50 insertions(+)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 2045c2e7cf..2a2ab3e9b0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -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;
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index f3ed9e7e4e..7da92c8c98 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -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);
>
ACK.
More information about the libvir-list
mailing list