> From: Yi Liu <yi.l.liu@xxxxxxxxx> > Sent: Thursday, May 11, 2023 10:39 PM > + if (cmd->hwpt_type != IOMMU_HWPT_TYPE_DEFAULT) { > + if (!ops->domain_alloc_user_data_len) { > + rc = -EOPNOTSUPP; > + goto out_put_idev; > + } > + klen = ops->domain_alloc_user_data_len(cmd->hwpt_type); > + if (WARN_ON(klen < 0)) { > + rc = -EINVAL; > + goto out_put_pt; > + } > + } What about passing the user pointer to the iommu driver which then does the copy so we don't need an extra @data_len() callback for every driver? > > + switch (pt_obj->type) { > + case IOMMUFD_OBJ_IOAS: > + ioas = container_of(pt_obj, struct iommufd_ioas, obj); > + break; this should fail if parent is specified. > + case IOMMUFD_OBJ_HW_PAGETABLE: > + /* pt_id points HWPT only when hwpt_type > is !IOMMU_HWPT_TYPE_DEFAULT */ > + if (cmd->hwpt_type == IOMMU_HWPT_TYPE_DEFAULT) { > + rc = -EINVAL; > + goto out_put_pt; > + } > + > + parent = container_of(pt_obj, struct iommufd_hw_pagetable, > obj); > + /* > + * Cannot allocate user-managed hwpt linking to > auto_created > + * hwpt. If the parent hwpt is already a user-managed hwpt, > + * don't allocate another user-managed hwpt linking to it. > + */ > + if (parent->auto_domain || parent->parent) { > + rc = -EINVAL; > + goto out_put_pt; > + } > + ioas = parent->ioas; for nesting why is ioas required? In concept we can just pass NULL ioas to iommufd_hw_pagetable_alloc() for this hwpt. If within that function there is a need to toggle ioas for the parent it can always retrieve it from the parent hwpt.