vfio: Move IOMMU_CAP_CACHE_COHERENCY test to after we know we have a group
The test isn't going to work if a group doesn't exist. Normally this isn't
a problem since VFIO isn't going to create a device if there is no group,
but the special CONFIG_VFIO_NOIOMMU behavior allows bypassing this
prevention. The new cap test effectively forces a group and breaks this
config option.
Move the cap test to vfio_group_find_or_alloc() which is the earliest time
we know we have a group available and thus are not running in noiommu mode.
Fixes: e8ae0e140c
("vfio: Require that devices support DMA cache coherence")
Reported-by: Xiang Chen <chenxiang66@hisilicon.com>
Tested-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/0-v1-e8934b490f36+f4-vfio_cap_fix_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
88084a3df1
commit
afe4e376ac
@ -549,6 +549,16 @@ static struct vfio_group *vfio_group_find_or_alloc(struct device *dev)
|
|||||||
if (!iommu_group)
|
if (!iommu_group)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* VFIO always sets IOMMU_CACHE because we offer no way for userspace to
|
||||||
|
* restore cache coherency. It has to be checked here because it is only
|
||||||
|
* valid for cases where we are using iommu groups.
|
||||||
|
*/
|
||||||
|
if (!iommu_capable(dev->bus, IOMMU_CAP_CACHE_COHERENCY)) {
|
||||||
|
iommu_group_put(iommu_group);
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
group = vfio_group_get_from_iommu(iommu_group);
|
group = vfio_group_get_from_iommu(iommu_group);
|
||||||
if (!group)
|
if (!group)
|
||||||
group = vfio_create_group(iommu_group, VFIO_IOMMU);
|
group = vfio_create_group(iommu_group, VFIO_IOMMU);
|
||||||
@ -601,13 +611,6 @@ static int __vfio_register_dev(struct vfio_device *device,
|
|||||||
|
|
||||||
int vfio_register_group_dev(struct vfio_device *device)
|
int vfio_register_group_dev(struct vfio_device *device)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* VFIO always sets IOMMU_CACHE because we offer no way for userspace to
|
|
||||||
* restore cache coherency.
|
|
||||||
*/
|
|
||||||
if (!iommu_capable(device->dev->bus, IOMMU_CAP_CACHE_COHERENCY))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return __vfio_register_dev(device,
|
return __vfio_register_dev(device,
|
||||||
vfio_group_find_or_alloc(device->dev));
|
vfio_group_find_or_alloc(device->dev));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user