On Fri, Nov 17, 2023 at 05:07:12AM -0800, Yi Liu wrote: > +/** > + * 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; > + int entry_num; These are u32 in the uapi, they should probably be u32 here too. Otherwise we have to worry about truncation. > @@ -465,6 +492,9 @@ 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, > + u32 *error_code); Regarding the other conversation I worry a u32 error_code is too small. Unfortunately there is no obvious place to put something better so if we reach it we will have to add more error_code space via normal extension. Maybe expand this to u64? That is 64 bits of error register data and the consumer index. It should do for SMMUv3 at least? Jason