Not quite, they would not call each other, they have differentI think it would be clear why iommu_group_set_dma_owner(), whichiommu_device_set_dma_owner() will eventually call
actually does detatch, is not the same thing as iommu_attach_device().
iommu_group_set_dma_owner(). I didn't get why
iommu_group_set_dma_owner() is special and need to keep.
implementations:
int iommu_device_use_dma_api(struct device *device)
{
struct iommu_group *group = device->iommu_group;
if (!group)
return 0;
mutex_lock(&group->mutex);
if (group->owner_cnt != 0 ||
group->domain != group->default_domain) {
mutex_unlock(&group->mutex);
return -EBUSY;
}
group->owner_cnt = 1;
group->owner = NULL;
mutex_unlock(&group->mutex);
return 0;
}
int iommu_group_set_dma_owner(struct iommu_group *group, struct file *owner)
{
mutex_lock(&group->mutex);
if (group->owner_cnt != 0) {
if (group->owner != owner)
goto err_unlock;
group->owner_cnt++;
mutex_unlock(&group->mutex);
return 0;
}
if (group->domain && group->domain != group->default_domain)
goto err_unlock;
__iommu_detach_group(group->domain, group);
group->owner_cnt = 1;
group->owner = owner;
mutex_unlock(&group->mutex);
return 0;
err_unlock;
mutex_unlock(&group->mutex);
return -EBUSY;
}
It is the same as how we ended up putting the refcounting logic
directly into the iommu_attach_device().
See, we get rid of the enum as a multiplexor parameter, each API does
only wnat it needs, they don't call each other.
We don't need _USER anymore because iommu_group_set_dma_owner() always
does detatch, and iommu_replace_group_domain() avoids ever reassigning
default_domain. The sepecial USER behavior falls out automatically.