Message ID | 20240529053250.91284-6-baolu.lu@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iommu: Refactoring domain allocation interface | expand |
On 2024/5/29 13:32, 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. you may want to move this patch before patch 03/04. > 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(+) > > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index 6648b2415474..16401de7802d 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -781,6 +781,7 @@ 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_user_domain_alloc(struct device *dev, u32 flags); > +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); > @@ -1092,6 +1093,11 @@ static inline struct iommu_domain *iommu_user_domain_alloc(struct device *dev, u > return ERR_PTR(-ENODEV); > } > > +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 f1416892ef8e..7df4a021b040 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; > @@ -2074,6 +2078,22 @@ struct iommu_domain *iommu_user_domain_alloc(struct device *dev, u32 flags) > } > EXPORT_SYMBOL_GPL(iommu_user_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)
On 5/29/24 5:04 PM, Yi Liu wrote: > On 2024/5/29 13:32, 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. > > you may want to move this patch before patch 03/04. Emm, why? Best regards, baolu
On 5/30/24 9:59 AM, Baolu Lu wrote: > On 5/29/24 5:04 PM, Yi Liu wrote: >> On 2024/5/29 13:32, 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. >> >> you may want to move this patch before patch 03/04. > > Emm, why? I see. The commit subject is misleading. It should be "vfio/type1: Use iommu_user_domain_alloc()". Best regards, baolu
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 6648b2415474..16401de7802d 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -781,6 +781,7 @@ 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_user_domain_alloc(struct device *dev, u32 flags); +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); @@ -1092,6 +1093,11 @@ static inline struct iommu_domain *iommu_user_domain_alloc(struct device *dev, u return ERR_PTR(-ENODEV); } +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 f1416892ef8e..7df4a021b040 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; @@ -2074,6 +2078,22 @@ struct iommu_domain *iommu_user_domain_alloc(struct device *dev, u32 flags) } EXPORT_SYMBOL_GPL(iommu_user_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(+)