[libvirt] [PATCH v4 03/10] Refuse to reattach from vfio if the iommu group is in use by any domain
Michal Privoznik
mprivozn at redhat.com
Mon Nov 23 17:05:03 UTC 2015
On 14.11.2015 09:36, Shivaprasad G Bhat wrote:
> It is incorrect to attempt the device reattach of a function,
> when some other domain is using some functions belonging to the same iommu
> group.
>
> Signed-off-by: Shivaprasad G Bhat <sbhat at linux.vnet.ibm.com>
> ---
> src/util/virhostdev.c | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
> index de029a0..f24ccd8 100644
> --- a/src/util/virhostdev.c
> +++ b/src/util/virhostdev.c
> @@ -1590,18 +1590,35 @@ virHostdevPCINodeDeviceReAttach(virHostdevManagerPtr hostdev_mgr,
> virPCIDevicePtr pci)
> {
> virPCIDeviceAddressPtr devAddr = NULL;
> + bool usesVfio = false;
> + char *drvPath = NULL;
> + char *drvName = NULL;
> struct virHostdevIsPCINodeDeviceUsedData data = {hostdev_mgr, NULL,
> false};
> int ret = -1;
>
> + if (virPCIDeviceGetDriverPathAndName(pci, &drvPath, &drvName) < 0)
> + goto out;
> +
> + if (STREQ_NULLABLE(drvName, "vfio-pci"))
> + usesVfio = true;
> +
> virObjectLock(hostdev_mgr->activePCIHostdevs);
> virObjectLock(hostdev_mgr->inactivePCIHostdevs);
>
> if (!(devAddr = virPCIDeviceGetAddress(pci)))
> goto out;
>
> - if (virHostdevIsPCINodeDeviceUsed(devAddr, &data))
> + if (usesVfio) {
> + /* Doesn't matter which device. If any domain is actively using the
> + * iommu group, refuse to reattach */
s/reattach/reattach./
And, does not matter right now, but maybe we will need to set
data.usesVfio = true; in this case. Currently, this will result in no-op
> + if (virPCIDeviceAddressIOMMUGroupIterate(devAddr,
> + virHostdevIsPCINodeDeviceUsed,
> + &data) < 0)
> + goto out;
> + } else if (virHostdevIsPCINodeDeviceUsed(devAddr, &data)) {
> goto out;
> + }
>
> virPCIDeviceReattachInit(pci);
>
> @@ -1614,6 +1631,8 @@ virHostdevPCINodeDeviceReAttach(virHostdevManagerPtr hostdev_mgr,
> virObjectUnlock(hostdev_mgr->inactivePCIHostdevs);
> virObjectUnlock(hostdev_mgr->activePCIHostdevs);
> VIR_FREE(devAddr);
> + VIR_FREE(drvPath);
> + VIR_FREE(drvName);
> return ret;
> }
>
And as you and Laine agreed, this is going to be turned into a list, so
this patch probably ends up being dropped anyway.
Michal
More information about the libvir-list
mailing list