On Fri, Apr 25, 2025 at 10:57:59PM -0700, Nicolin Chen wrote:
Similar to the iommu_copy_struct_from_user helper receiving data from the user space, add an iommu_copy_struct_to_user helper to report output data back to the user space data pointer.
Reviewed-by: Jason Gunthorpe jgg@nvidia.com Signed-off-by: Nicolin Chen nicolinc@nvidia.com
include/linux/iommu.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index ba7add27e9a0..634ff647888d 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -562,6 +562,46 @@ iommu_copy_struct_from_full_user_array(void *kdst, size_t kdst_entry_size, return 0; } +/**
- __iommu_copy_struct_to_user - Report iommu driver specific user space data
- @dst_data: Pointer to a struct iommu_user_data for user space data location
- @src_data: Pointer to an iommu driver specific user data that is defined in
include/uapi/linux/iommufd.h
- @data_type: The data type of the @dst_data. Must match with @src_data.type
^ Nit: Must match with @dst_data type.
- @data_len: Length of current user data structure, i.e. sizeof(struct _src)
- @min_len: Initial length of user data structure for backward compatibility.
This should be offsetofend using the last member in the user data
struct that was initially added to include/uapi/linux/iommufd.h
- */
+static inline int +__iommu_copy_struct_to_user(const struct iommu_user_data *dst_data,
void *src_data, unsigned int data_type,
size_t data_len, size_t min_len)
+{
- if (WARN_ON(!dst_data || !src_data))
return -EINVAL;
- if (dst_data->type != data_type)
return -EINVAL;
- if (dst_data->len < min_len || data_len < dst_data->len)
return -EINVAL;
- return copy_struct_to_user(dst_data->uptr, dst_data->len, src_data,
data_len, NULL);
+}
+/**
- iommu_copy_struct_to_user - Report iommu driver specific user space data
- @user_data: Pointer to a struct iommu_user_data for user space data location
- @ksrc: Pointer to an iommu driver specific user data that is defined in
include/uapi/linux/iommufd.h
- @data_type: The data type of the @ksrc. Must match with @user_data->type
- @min_last: The last member of the data structure @ksrc points in the initial
version.
- Return 0 for success, otherwise -error.
- */
+#define iommu_copy_struct_to_user(user_data, ksrc, data_type, min_last) \
- __iommu_copy_struct_to_user(user_data, ksrc, data_type, sizeof(*ksrc), \
offsetofend(typeof(*ksrc), min_last))
/**
- struct iommu_ops - iommu ops and capabilities
- @capable: check capability
With the above nit. Reviewed-by: Pranjal Shrivastava praan@google.com
-- 2.43.0