Skip to content

Commit

Permalink
iommu: Add cache_invalidate_user op
Browse files Browse the repository at this point in the history
The updates of the PTEs in the nested page table will be propagated to 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 containing a number of invalidation
data entries.

Link: https://lore.kernel.org/r/20240111041015.47920-2-yi.l.liu@intel.com
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
  • Loading branch information
LuBaolu authored and jgunthorpe committed Jan 11, 2024
1 parent 861deac commit f35b88b
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions include/linux/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,23 @@ 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
* @entry_len: The fixed-width length of an entry in the array, in bytes
* @entry_num: The number of total entries in the array
*
* The user buffer includes an array of requests with format defined in
* include/uapi/linux/iommufd.h
*/
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
Expand Down Expand Up @@ -440,6 +457,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
Expand All @@ -465,6 +489,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);
Expand Down

0 comments on commit f35b88b

Please sign in to comment.