From: Jason Gunthorpe jgg@nvidia.com Sent: Wednesday, October 26, 2022 2:12 AM
From: Lu Baolu baolu.lu@linux.intel.com
These complement the group interfaces and are for use by VFIO. The main
s/VFIO/iommufd/
difference is that multiple devices in the same group can all share the ownership by passing the same ownership pointer.
Move the common code into shared functions.
Signed-off-by: Lu Baolu baolu.lu@linux.intel.com Signed-off-by: Jason Gunthorpe jgg@nvidia.com
drivers/iommu/iommu.c | 116 +++++++++++++++++++++++++++++++++-------
include/linux/iommu.h | 13 +++++ 2 files changed, 104 insertions(+), 25 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 65a3b3d886dc00..e34dde68ae2b0d 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -3148,14 +3148,33 @@ static int __iommu_group_alloc_blocking_domain(struct iommu_group *group) return 0; }
+static int __iommu_take_dma_ownership(struct iommu_group *group, void *owner) +{
- int ret;
- if (group->domain && group->domain != group->default_domain)
return -EBUSY;
remove the space before -EBUSY
+int iommu_device_claim_dma_owner(struct device *dev, void *owner) {
- int ret;
struct iommu_group *group = iommu_group_get(dev);
int ret = 0;
if (!group)
return -ENODEV;
mutex_lock(&group->mutex);
- if (WARN_ON(!group->owner_cnt || !group->owner))
- if (group->owner_cnt) {
if (group->owner != owner) {
ret = -EPERM;
goto unlock_out;
}
check owner!=NULL otherwise this call may inadvertently succeed if the caller assigns a NULL owner while the group has already been grabbed by a kernel driver.