Message ID | 20240610085555.88197-2-baolu.lu@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iommu: Refactoring domain allocation interface | expand |
On Mon, Jun 10, 2024 at 04:55:35PM +0800, Lu Baolu wrote: > Commit <17de3f5fdd35> ("iommu: Retire bus ops") removes iommu ops from > bus. The iommu subsystem no longer relies on bus for operations. So the > bus parameter in iommu_domain_alloc() is no longer relevant. > > Add a new interface named iommu_paging_domain_alloc(), which explicitly > indicates the allocation of a paging domain for DMA managed by a kernel > driver. The new interface takes a device pointer as its parameter, that > better aligns with the current iommu subsystem. > > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> > --- > include/linux/iommu.h | 6 ++++++ > drivers/iommu/iommu.c | 20 ++++++++++++++++++++ > 2 files changed, 26 insertions(+) Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Jason
On 6/10/2024 2:25 PM, Lu Baolu wrote: > Commit <17de3f5fdd35> ("iommu: Retire bus ops") removes iommu ops from > bus. The iommu subsystem no longer relies on bus for operations. So the > bus parameter in iommu_domain_alloc() is no longer relevant. > > Add a new interface named iommu_paging_domain_alloc(), which explicitly > indicates the allocation of a paging domain for DMA managed by a kernel > driver. The new interface takes a device pointer as its parameter, that > better aligns with the current iommu subsystem. > > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Vasant Hegde <vasant.hegde@amd.com> -Vasant > --- > include/linux/iommu.h | 6 ++++++ > drivers/iommu/iommu.c | 20 ++++++++++++++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index 7bc8dff7cf6d..46f1348f1f0a 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -780,6 +780,7 @@ extern bool iommu_present(const struct bus_type *bus); > extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap); > extern bool iommu_group_has_isolated_msi(struct iommu_group *group); > extern struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus); > +struct iommu_domain *iommu_paging_domain_alloc(struct device *dev); > extern void iommu_domain_free(struct iommu_domain *domain); > extern int iommu_attach_device(struct iommu_domain *domain, > struct device *dev); > @@ -1086,6 +1087,11 @@ static inline struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus > return NULL; > } > > +static inline struct iommu_domain *iommu_paging_domain_alloc(struct device *dev) > +{ > + return ERR_PTR(-ENODEV); > +} > + > static inline void iommu_domain_free(struct iommu_domain *domain) > { > } > diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c > index 9df7cc75c1bc..e03c71a34347 100644 > --- a/drivers/iommu/iommu.c > +++ b/drivers/iommu/iommu.c > @@ -2016,6 +2016,10 @@ static int __iommu_domain_alloc_dev(struct device *dev, void *data) > return 0; > } > > +/* > + * The iommu ops in bus has been retired. Do not use this interface in > + * new drivers. > + */ > struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) > { > const struct iommu_ops *ops = NULL; > @@ -2032,6 +2036,22 @@ struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) > } > EXPORT_SYMBOL_GPL(iommu_domain_alloc); > > +/** > + * iommu_paging_domain_alloc() - Allocate a paging domain > + * @dev: device for which the domain is allocated > + * > + * Allocate a paging domain which will be managed by a kernel driver. Return > + * allocated domain if successful, or a ERR pointer for failure. > + */ > +struct iommu_domain *iommu_paging_domain_alloc(struct device *dev) > +{ > + if (!dev_has_iommu(dev)) > + return ERR_PTR(-ENODEV); > + > + return __iommu_domain_alloc(dev_iommu_ops(dev), dev, IOMMU_DOMAIN_UNMANAGED); > +} > +EXPORT_SYMBOL_GPL(iommu_paging_domain_alloc); > + > void iommu_domain_free(struct iommu_domain *domain) > { > if (domain->type == IOMMU_DOMAIN_SVA)
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 7bc8dff7cf6d..46f1348f1f0a 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -780,6 +780,7 @@ extern bool iommu_present(const struct bus_type *bus); extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap); extern bool iommu_group_has_isolated_msi(struct iommu_group *group); extern struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus); +struct iommu_domain *iommu_paging_domain_alloc(struct device *dev); extern void iommu_domain_free(struct iommu_domain *domain); extern int iommu_attach_device(struct iommu_domain *domain, struct device *dev); @@ -1086,6 +1087,11 @@ static inline struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus return NULL; } +static inline struct iommu_domain *iommu_paging_domain_alloc(struct device *dev) +{ + return ERR_PTR(-ENODEV); +} + static inline void iommu_domain_free(struct iommu_domain *domain) { } diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 9df7cc75c1bc..e03c71a34347 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2016,6 +2016,10 @@ static int __iommu_domain_alloc_dev(struct device *dev, void *data) return 0; } +/* + * The iommu ops in bus has been retired. Do not use this interface in + * new drivers. + */ struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) { const struct iommu_ops *ops = NULL; @@ -2032,6 +2036,22 @@ struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus) } EXPORT_SYMBOL_GPL(iommu_domain_alloc); +/** + * iommu_paging_domain_alloc() - Allocate a paging domain + * @dev: device for which the domain is allocated + * + * Allocate a paging domain which will be managed by a kernel driver. Return + * allocated domain if successful, or a ERR pointer for failure. + */ +struct iommu_domain *iommu_paging_domain_alloc(struct device *dev) +{ + if (!dev_has_iommu(dev)) + return ERR_PTR(-ENODEV); + + return __iommu_domain_alloc(dev_iommu_ops(dev), dev, IOMMU_DOMAIN_UNMANAGED); +} +EXPORT_SYMBOL_GPL(iommu_paging_domain_alloc); + void iommu_domain_free(struct iommu_domain *domain) { if (domain->type == IOMMU_DOMAIN_SVA)
Commit <17de3f5fdd35> ("iommu: Retire bus ops") removes iommu ops from bus. The iommu subsystem no longer relies on bus for operations. So the bus parameter in iommu_domain_alloc() is no longer relevant. Add a new interface named iommu_paging_domain_alloc(), which explicitly indicates the allocation of a paging domain for DMA managed by a kernel driver. The new interface takes a device pointer as its parameter, that better aligns with the current iommu subsystem. Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> --- include/linux/iommu.h | 6 ++++++ drivers/iommu/iommu.c | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+)