On Fri, Sep 20, 2013 at 11:06:59AM +0200, Peter Krempa wrote:
> Check the presence of the selected PCI passthrough option when starting
> a VM.
> ---
>  src/qemu/qemu_process.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index dd16f6c..e36ab99 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3481,6 +3481,8 @@ int qemuProcessStart(virConnectPtr conn,
>      unsigned int stop_flags;
>      virQEMUDriverConfigPtr cfg;
>      virCapsPtr caps = NULL;
> +    int supportsPassthroughKVM = -1;
> +    int supportsPassthroughVFIO = -1;
> 
>      /* Okay, these are just internal flags,
>       * but doesn't hurt to check */
> @@ -3713,6 +3715,45 @@ int qemuProcessStart(virConnectPtr conn,
>          goto cleanup;
>      }
> 
> +    /* assign defaults for hostdev passthrough */
> +    for (i = 0; i < vm->def->nhostdevs; i++) {
> +        virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i];
> +
> +        if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
> +            hostdev->source.subsys.type == 
> VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
> +            int *backend = &hostdev->source.subsys.u.pci.backend;
> +
> +            /* cache host state of passthrough support */
> +            if (supportsPassthroughKVM == -1 || supportsPassthroughVFIO == 
> -1) {
> +                supportsPassthroughKVM = 
> qemuHostdevHostSupportsPassthroughLegacy();
> +                supportsPassthroughVFIO = 
> qemuHostdevHostSupportsPassthroughVFIO();
> +            }
> +
> +            switch ((virDomainHostdevSubsysPciBackendType) *backend) {
> +            case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
> +                if (!supportsPassthroughVFIO) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                                   _("host doesn't support VFIO PCI 
> passthrough"));
> +                    goto cleanup;
> +                }
> +                break;
> +
> +            case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
> +            case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
> +                if (!supportsPassthroughKVM) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                                   _("host doesn't support legacy PCI 
> passthrough"));
> +                    goto cleanup;
> +                }
> +
> +                break;
> +
> +            case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
> +                break;
> +            }
> +        }
> +    }

It seems like the body of this loop ought to be shared with the hotplug
code, in a helper function, so we don't have so much extra code in this
start method


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

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

Reply via email to