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