[libvirt] [PATCH 4/7] hostdev: Add detachPCIDevices()

Daniel P. Berrange berrange at redhat.com
Fri Jan 22 15:02:57 UTC 2016


On Tue, Jan 19, 2016 at 04:36:06PM +0100, Andrea Bolognani wrote:
> This function mirrors reattachPCIDevices().
> 
> The handling of active and inactive devices is updated and made more
> explicit, which means virHostdevPreparePCIDevices() has to be
> updated as well.
> ---
>  src/util/virhostdev.c | 125 ++++++++++++++++++++++++++++++--------------------
>  1 file changed, 76 insertions(+), 49 deletions(-)
> 
> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
> index 74c43f2..2d219dd 100644
> --- a/src/util/virhostdev.c
> +++ b/src/util/virhostdev.c
> @@ -593,6 +593,56 @@ reattachPCIDevices(virHostdevManagerPtr mgr,
>      return ret;
>  }
>  
> +/**
> + * detachPCIDevices:

Please keep a virHostdev prefix on this method, and also on the
one added in the earlier patch. All methods should be prefixed
to match the filename, even if they're static

> + * @mgr: hostdev manager
> + * @pcidevs: PCI devices to be detached
> + * @skipUnmanaged: whether to skip unmanaged devices
> + *
> + * Detach PCI devices from the host.
> + *
> + * The PCI related parts of @mgr (inactivePCIHostdevs, activePCIHostdevs)
> + * must have been locked beforehand using virObjectLock().
> + *
> + * Returns: 0 on success, <0 on failure
> + */
> +static int
> +detachPCIDevices(virHostdevManagerPtr mgr,
> +                 virPCIDeviceListPtr pcidevs,
> +                 bool skipUnmanaged)
> +{
> +    size_t i;
> +    int ret = -1;
> +
> +    for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
> +        virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i);
> +
> +        /* Skip unmanaged devices if asked to do so */
> +        if (!virPCIDeviceGetManaged(dev) && skipUnmanaged) {
> +            VIR_DEBUG("Not detaching unmanaged PCI device %s",
> +                      virPCIDeviceGetName(dev));
> +            continue;
> +        }
> +
> +        VIR_DEBUG("Detaching managed PCI device %s",
> +                  virPCIDeviceGetName(dev));
> +        if (virPCIDeviceDetach(dev,
> +                               mgr->activePCIHostdevs,
> +                               mgr->inactivePCIHostdevs) < 0) {
> +            virErrorPtr err = virGetLastError();
> +            VIR_ERROR(_("Failed to detach PCI device: %s"),
> +                      err ? err->message : _("unknown error"));
> +            virResetError(err);
> +            goto out;
> +        }
> +    }
> +
> +    ret = 0;
> +
> + out:
> +    return ret;
> +}

Again the body of the for() loop should really be a separate method
that you can call passing in a single PCI device, to avoid later
code where you have to stuff a single device into a list.


Regards,
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 :|




More information about the libvir-list mailing list