Message ID | 20231221153948.119007-2-yi.l.liu@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Add iommufd nesting (part 2/2) | expand |
> From: Liu, Yi L <yi.l.liu@intel.com> > Sent: Thursday, December 21, 2023 11:40 PM > > From: Lu Baolu <baolu.lu@linux.intel.com> > > The updates of the PTEs in the nested page table will be propagated to the > hardware caches on both IOMMU (IOTLB) and devices (DevTLB/ATC). this is incorrect. the scope of this cmd is driver specific. > > Add a new domain op cache_invalidate_user for the userspace to flush the > hardware caches for a nested domain through iommufd. No wrapper for it, > as it's only supposed to be used by iommufd. Then, pass in invalidation > requests in form of a user data array conatining a number of invalidation > data entries. > > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> > Reviewed-by: Kevin Tian <kevin.tian@intel.com> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > --- > include/linux/iommu.h | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index 6291aa7b079b..5c4a17f13761 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -284,6 +284,24 @@ struct iommu_user_data { > size_t len; > }; > > +/** > + * struct iommu_user_data_array - iommu driver specific user space data > array > + * @type: The data type of all the entries in the user buffer array > + * @uptr: Pointer to the user buffer array for copy_from_user() remove 'for copy_from_user(); > + * @entry_len: The fixed-width length of a entry in the array, in bytes s/a/an/ > + * @entry_num: The number of total entries in the array > + * > + * A array having a @entry_num number of @entry_len sized entries, each the first sentence is redundant. > entry is > + * user space data, an uAPI defined in include/uapi/linux/iommufd.h where > @type > + * is also defined as enum iommu_xyz_data_type. I'd just say: "The user buffer includes an array of requests with format defined in include/uapi/linux/iommufd.h"
On 2023/12/22 10:30, Tian, Kevin wrote: >> From: Liu, Yi L <yi.l.liu@intel.com> >> Sent: Thursday, December 21, 2023 11:40 PM >> >> From: Lu Baolu <baolu.lu@linux.intel.com> >> >> The updates of the PTEs in the nested page table will be propagated to the >> hardware caches on both IOMMU (IOTLB) and devices (DevTLB/ATC). > > this is incorrect. the scope of this cmd is driver specific. yes. May just say the hardware caches. > >> >> Add a new domain op cache_invalidate_user for the userspace to flush the >> hardware caches for a nested domain through iommufd. No wrapper for it, >> as it's only supposed to be used by iommufd. Then, pass in invalidation >> requests in form of a user data array conatining a number of invalidation >> data entries. >> >> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> >> Reviewed-by: Kevin Tian <kevin.tian@intel.com> >> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> >> Signed-off-by: Yi Liu <yi.l.liu@intel.com> >> --- >> include/linux/iommu.h | 27 +++++++++++++++++++++++++++ >> 1 file changed, 27 insertions(+) >> >> diff --git a/include/linux/iommu.h b/include/linux/iommu.h >> index 6291aa7b079b..5c4a17f13761 100644 >> --- a/include/linux/iommu.h >> +++ b/include/linux/iommu.h >> @@ -284,6 +284,24 @@ struct iommu_user_data { >> size_t len; >> }; >> >> +/** >> + * struct iommu_user_data_array - iommu driver specific user space data >> array >> + * @type: The data type of all the entries in the user buffer array >> + * @uptr: Pointer to the user buffer array for copy_from_user() > > remove 'for copy_from_user(); > >> + * @entry_len: The fixed-width length of a entry in the array, in bytes > > s/a/an/ > >> + * @entry_num: The number of total entries in the array >> + * >> + * A array having a @entry_num number of @entry_len sized entries, each > > the first sentence is redundant. > >> entry is >> + * user space data, an uAPI defined in include/uapi/linux/iommufd.h where >> @type >> + * is also defined as enum iommu_xyz_data_type. > > I'd just say: > > "The user buffer includes an array of requests with format defined > in include/uapi/linux/iommufd.h" sure.
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 6291aa7b079b..5c4a17f13761 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -284,6 +284,24 @@ struct iommu_user_data { size_t len; }; +/** + * struct iommu_user_data_array - iommu driver specific user space data array + * @type: The data type of all the entries in the user buffer array + * @uptr: Pointer to the user buffer array for copy_from_user() + * @entry_len: The fixed-width length of a entry in the array, in bytes + * @entry_num: The number of total entries in the array + * + * A array having a @entry_num number of @entry_len sized entries, each entry is + * user space data, an uAPI defined in include/uapi/linux/iommufd.h where @type + * is also defined as enum iommu_xyz_data_type. + */ +struct iommu_user_data_array { + unsigned int type; + void __user *uptr; + size_t entry_len; + u32 entry_num; +}; + /** * __iommu_copy_struct_from_user - Copy iommu driver specific user space data * @dst_data: Pointer to an iommu driver specific user data that is defined in @@ -440,6 +458,13 @@ struct iommu_ops { * @iotlb_sync_map: Sync mappings created recently using @map to the hardware * @iotlb_sync: Flush all queued ranges from the hardware TLBs and empty flush * queue + * @cache_invalidate_user: Flush hardware cache for user space IO page table. + * The @domain must be IOMMU_DOMAIN_NESTED. The @array + * passes in the cache invalidation requests, in form + * of a driver data structure. The driver must update + * array->entry_num to report the number of handled + * invalidation requests. The driver data structure + * must be defined in include/uapi/linux/iommufd.h * @iova_to_phys: translate iova to physical address * @enforce_cache_coherency: Prevent any kind of DMA from bypassing IOMMU_CACHE, * including no-snoop TLPs on PCIe or other platform @@ -465,6 +490,8 @@ struct iommu_domain_ops { size_t size); void (*iotlb_sync)(struct iommu_domain *domain, struct iommu_iotlb_gather *iotlb_gather); + int (*cache_invalidate_user)(struct iommu_domain *domain, + struct iommu_user_data_array *array); phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);