[libvirt] [PATCH 14/18] virhostdev: Check driver name too in virHostdevIsPCINodeDeviceUsed()
Daniel Henrique Barboza
danielhb413 at gmail.com
Fri Aug 16 21:10:40 UTC 2019
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
On 8/14/19 8:57 AM, Michal Privoznik wrote:
> It may happen that there are two domains with the same name in
> two separate drivers (e.g. qemu and lxc). That is why for PCI
> devices we track both names of driver and domain combination
> which has taken the device. However, when we check if given PCI
> device is in use (or PCI devices from the same IOMMU group) we
> compare only domain name. This means that we can mistakenly claim
> device as free to use while in fact it isn't.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/util/virhostdev.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
> index 75e44b5227..cb69582c21 100644
> --- a/src/util/virhostdev.c
> +++ b/src/util/virhostdev.c
> @@ -51,6 +51,7 @@ static virHostdevManagerPtr virHostdevManagerNew(void);
>
> struct virHostdevIsPCINodeDeviceUsedData {
> virHostdevManagerPtr mgr;
> + const char *driverName;
> const char *domainName;
> const bool usesVFIO;
> };
> @@ -91,8 +92,8 @@ static int virHostdevIsPCINodeDeviceUsed(virPCIDeviceAddressPtr devAddr, void *o
> virPCIDeviceGetUsedBy(actual, &actual_drvname, &actual_domname);
>
> if (helperData->usesVFIO &&
> - (actual_domname && helperData->domainName) &&
> - (STREQ(actual_domname, helperData->domainName)))
> + STREQ_NULLABLE(actual_drvname, helperData->driverName) &&
> + STREQ_NULLABLE(actual_domname, helperData->domainName))
> goto iommu_owner;
>
> if (actual_drvname && actual_domname)
> @@ -706,7 +707,7 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr,
> virPCIDevicePtr pci = virPCIDeviceListGet(pcidevs, i);
> bool strict_acs_check = !!(flags & VIR_HOSTDEV_STRICT_ACS_CHECK);
> bool usesVFIO = (virPCIDeviceGetStubDriver(pci) == VIR_PCI_STUB_DRIVER_VFIO);
> - struct virHostdevIsPCINodeDeviceUsedData data = { mgr, dom_name, usesVFIO };
> + struct virHostdevIsPCINodeDeviceUsedData data = {mgr, drv_name, dom_name, usesVFIO};
> int hdrType = -1;
>
> if (virPCIGetHeaderType(pci, &hdrType) < 0)
> @@ -1995,7 +1996,7 @@ int
> virHostdevPCINodeDeviceDetach(virHostdevManagerPtr mgr,
> virPCIDevicePtr pci)
> {
> - struct virHostdevIsPCINodeDeviceUsedData data = { mgr, NULL, false };
> + struct virHostdevIsPCINodeDeviceUsedData data = {mgr, NULL, NULL, false};
> int ret = -1;
>
> virObjectLock(mgr->activePCIHostdevs);
> @@ -2021,7 +2022,7 @@ int
> virHostdevPCINodeDeviceReAttach(virHostdevManagerPtr mgr,
> virPCIDevicePtr pci)
> {
> - struct virHostdevIsPCINodeDeviceUsedData data = { mgr, NULL, false };
> + struct virHostdevIsPCINodeDeviceUsedData data = {mgr, NULL, NULL, false};
> int ret = -1;
>
> virObjectLock(mgr->activePCIHostdevs);
More information about the libvir-list
mailing list