Skip to content

Commit f35b88b

Browse files
LuBaolujgunthorpe
authored andcommitted
iommu: Add cache_invalidate_user op
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>
1 parent 861deac commit f35b88b

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

include/linux/iommu.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,23 @@ struct iommu_user_data {
284284
size_t len;
285285
};
286286

287+
/**
288+
* struct iommu_user_data_array - iommu driver specific user space data array
289+
* @type: The data type of all the entries in the user buffer array
290+
* @uptr: Pointer to the user buffer array
291+
* @entry_len: The fixed-width length of an entry in the array, in bytes
292+
* @entry_num: The number of total entries in the array
293+
*
294+
* The user buffer includes an array of requests with format defined in
295+
* include/uapi/linux/iommufd.h
296+
*/
297+
struct iommu_user_data_array {
298+
unsigned int type;
299+
void __user *uptr;
300+
size_t entry_len;
301+
u32 entry_num;
302+
};
303+
287304
/**
288305
* __iommu_copy_struct_from_user - Copy iommu driver specific user space data
289306
* @dst_data: Pointer to an iommu driver specific user data that is defined in
@@ -440,6 +457,13 @@ struct iommu_ops {
440457
* @iotlb_sync_map: Sync mappings created recently using @map to the hardware
441458
* @iotlb_sync: Flush all queued ranges from the hardware TLBs and empty flush
442459
* queue
460+
* @cache_invalidate_user: Flush hardware cache for user space IO page table.
461+
* The @domain must be IOMMU_DOMAIN_NESTED. The @array
462+
* passes in the cache invalidation requests, in form
463+
* of a driver data structure. The driver must update
464+
* array->entry_num to report the number of handled
465+
* invalidation requests. The driver data structure
466+
* must be defined in include/uapi/linux/iommufd.h
443467
* @iova_to_phys: translate iova to physical address
444468
* @enforce_cache_coherency: Prevent any kind of DMA from bypassing IOMMU_CACHE,
445469
* including no-snoop TLPs on PCIe or other platform
@@ -465,6 +489,8 @@ struct iommu_domain_ops {
465489
size_t size);
466490
void (*iotlb_sync)(struct iommu_domain *domain,
467491
struct iommu_iotlb_gather *iotlb_gather);
492+
int (*cache_invalidate_user)(struct iommu_domain *domain,
493+
struct iommu_user_data_array *array);
468494

469495
phys_addr_t (*iova_to_phys)(struct iommu_domain *domain,
470496
dma_addr_t iova);

0 commit comments

Comments
 (0)