@@ -136,14 +136,6 @@ int iopt_pin_pages(struct io_pagetable *iopt, unsigned long iova,
void iopt_unpin_pages(struct io_pagetable *iopt, unsigned long iova,
unsigned long length, bool is_owner);
-struct iommufd_ucmd {
- struct iommufd_ctx *ictx;
- void __user *ubuffer;
- u32 user_size;
- void *cmd;
- struct iommufd_object *new_obj;
-};
-
int iommufd_vfio_ioctl(struct iommufd_ctx *ictx, unsigned int cmd,
unsigned long arg);
@@ -52,6 +52,14 @@ struct iommufd_object {
unsigned int id;
};
+struct iommufd_ucmd {
+ struct iommufd_ctx *ictx;
+ void __user *ubuffer;
+ u32 user_size;
+ void *cmd;
+ struct iommufd_object *new_obj;
+};
+
#define __iommufd_object_alloc_ucmd(ucmd, ptr, type, obj) \
container_of(_iommufd_object_alloc_ucmd( \
ucmd, \
@@ -262,8 +270,10 @@ static inline int iommufd_viommu_report_event(struct iommufd_viommu *viommu,
\
ret = (drv_struct *)__iommufd_object_alloc_ucmd( \
ucmd, ret, IOMMUFD_OBJ_VIOMMU, member.obj); \
- if (!IS_ERR(ret)) \
+ if (!IS_ERR(ret)) { \
ret->member.ops = viommu_ops; \
+ ret->member.ictx = ucmd->ictx; \
+ } \
ret; \
})
#endif
@@ -60,9 +60,14 @@ int iommufd_viommu_alloc_ioctl(struct iommufd_ucmd *ucmd)
goto out_put_hwpt;
}
+ /* The iommufd_viommu_alloc helper saves ucmd->ictx in viommu->ictx */
+ if (WARN_ON_ONCE(viommu->ictx != ucmd->ictx)) {
+ rc = -EINVAL;
+ goto out_put_hwpt;
+ }
+
xa_init(&viommu->vdevs);
viommu->type = cmd->type;
- viommu->ictx = ucmd->ictx;
viommu->hwpt = hwpt_paging;
refcount_inc(&viommu->hwpt->common.obj.users);
INIT_LIST_HEAD(&viommu->veventqs);