[libvirt] [PATCH 3/4] qemu: Fix memory (and FD) leak on PCI device detach

Osier Yang jyang at redhat.com
Tue Dec 4 14:29:23 UTC 2012


On 2012年12月04日 18:38, Jiri Denemark wrote:
> Unmanaged PCI devices were only leaked if pciDeviceListAdd failed but
> managed devices were always leaked. And leaking PCI device is likely to
> leave PCI config file descriptor open. This patch fixes
> qemuReattachPciDevice to either free the PCI device or add it to the
> inactivePciHostdevs list.
> ---
>   src/qemu/qemu_hostdev.c | 14 +++++++-------
>   1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
> index b79319e..a748b8b 100644
> --- a/src/qemu/qemu_hostdev.c
> +++ b/src/qemu/qemu_hostdev.c
> @@ -546,10 +546,8 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
>       }
>
>       /* Loop 9: Now steal all the devices from pcidevs */
> -    while (pciDeviceListCount(pcidevs)>  0) {
> -        pciDevice *dev = pciDeviceListGet(pcidevs, 0);
> -        pciDeviceListSteal(pcidevs, dev);
> -    }
> +    while (pciDeviceListCount(pcidevs)>  0)
> +        pciDeviceListStealIndex(pcidevs, 0);
>
>       ret = 0;
>       goto cleanup;
> @@ -818,7 +816,8 @@ void qemuReattachPciDevice(pciDevice *dev, virQEMUDriverPtr driver)
>        * successfully, it must have been inactive.
>        */
>       if (!pciDeviceGetManaged(dev)) {
> -        pciDeviceListAdd(driver->inactivePciHostdevs, dev);
> +        if (pciDeviceListAdd(driver->inactivePciHostdevs, dev)<  0)
> +            pciFreeDevice(dev);
>           return;
>       }
>
> @@ -835,6 +834,7 @@ void qemuReattachPciDevice(pciDevice *dev, virQEMUDriverPtr driver)
>                     err ? err->message : _("unknown error"));
>           virResetError(err);
>       }
> +    pciFreeDevice(dev);
>   }

This produces the similar problem 1/4 tries to fix. pciDeviceListFree
right after will free the whole list. Except this, the using of
pciDeviceListStealIndex is nice.

Osier




More information about the libvir-list mailing list