[libvirt] [PATCH v4 12/14] qemu: Format mdevs on qemu command line

Erik Skultety posted 14 patches 8 years, 3 months ago
[libvirt] [PATCH v4 12/14] qemu: Format mdevs on qemu command line
Posted by Erik Skultety 8 years, 3 months ago
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>
---
 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);
-- 
2.12.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v4 12/14] qemu: Format mdevs on qemu command line
Posted by Laine Stump 8 years, 3 months ago
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@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.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list