Message ID | 65b51f57d08069c9da909586faf4e73d247a54f5.1744353300.git.nicolinc@nvidia.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | iommufd: Add vIOMMU infrastructure (Part-4 vCMDQ) | expand |
On 11-04-2025 12:07, Nicolin Chen wrote: > + * 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 memember of the data structure @ksrc points in the old typo memember -> member > + * initial version. > + * Return 0 for success, otherwise -error. Thanks, Alok
> On Apr 11, 2025, at 1:37 AM, Nicolin Chen <nicolinc@nvidia.com> wrote: > +__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 (dst_data->type != data_type) > + return -EINVAL; > + if (WARN_ON(!dst_data || !src_data)) > + return -EINVAL; The NULL pointer check should be first. -matt
On Mon, Apr 14, 2025 at 08:25:40AM -0700, Matt Ochs wrote: > > On Apr 11, 2025, at 1:37 AM, Nicolin Chen <nicolinc@nvidia.com> wrote: > > +__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 (dst_data->type != data_type) > > + return -EINVAL; > > + if (WARN_ON(!dst_data || !src_data)) > > + return -EINVAL; > > The NULL pointer check should be first. Fixed. We seem to have the same issue in __iommu_copy_struct_from_user(). Will send a patch fix that too. Thanks Nicolin
On Fri, Apr 11, 2025 at 06:05:30PM +0530, ALOK TIWARI wrote: > On 11-04-2025 12:07, Nicolin Chen wrote: > > + * 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 memember of the data structure @ksrc points in the > > old typo memember -> member Fixed for this one. And yea, we need a patch fixing iommu_copy_struct_from_user() too. Thanks Nicolin
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index ebde19aa3c28..ffb00054da33 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 + * @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 (dst_data->type != data_type) + return -EINVAL; + if (WARN_ON(!dst_data || !src_data)) + 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 memember 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
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. Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> --- include/linux/iommu.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)