Messages in this thread | | | Date | Thu, 5 Jan 2023 13:58:42 +0800 | From | Baolu Lu <> | Subject | Re: [PATCH v4 10/19] iommu: Add set_platform_dma_ops iommu ops |
| |
Hi Jason,
On 2023/1/4 21:17, Jason Gunthorpe wrote: > On Wed, Jan 04, 2023 at 08:57:16PM +0800, Lu Baolu wrote: > >> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c >> index de91dd88705b..4e35a9f94873 100644 >> --- a/drivers/iommu/iommu.c >> +++ b/drivers/iommu/iommu.c >> @@ -2163,6 +2163,17 @@ static int iommu_group_do_detach_device(struct device *dev, void *data) >> return 0; >> } >> >> +static int iommu_group_do_set_platform_dma(struct device *dev, void *data) >> +{ >> + const struct iommu_ops *ops = dev_iommu_ops(dev); >> + >> + if (!ops->set_platform_dma_ops) >> + return -EINVAL; >> + >> + ops->set_platform_dma_ops(dev); >> + return 0; >> +} >> + >> static int __iommu_group_set_domain(struct iommu_group *group, >> struct iommu_domain *new_domain) >> { >> @@ -2177,10 +2188,14 @@ static int __iommu_group_set_domain(struct iommu_group *group, >> * platform specific behavior. >> */ >> if (!new_domain) { >> - if (WARN_ON(!group->domain->ops->detach_dev)) >> - return -EINVAL; > This should still have the WARN_ON.. > > if (WARN_ON(!group->domain->ops->detach_dev && !dev_iommu_ops(dev)->set_platform_dma_ops)
This has been implicitly included in the code.
iommu_group_do_set_platform_dma() returns -EINVAL if the iommu driver doesn't support set_platform_dma_ops (otherwise always return success). Then, the domain->ops->detach_dev is required and a WARN_ON was there.
if (!new_domain) { ret = __iommu_group_for_each_dev(group, NULL, iommu_group_do_set_platform_dma); if (ret) { if (WARN_ON(!group->domain->ops->detach_dev)) return -EINVAL; __iommu_group_for_each_dev(group, group->domain, iommu_group_do_detach_device); } group->domain = NULL; return 0; }
Perhaps I should add a comment to explain this?
-- Best regards, baolu
| |