On Fri, May 19, 2023 at 09:41:00AM +0000, Tian, Kevin wrote: > External email: Use caution opening links or attachments > > > > 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? It's doable by letting the driver do copy_from_user(), yet I recall that Jason suggested to keep it in the iommufd. Also, we are reusing the ucmd_buffer for the user_data. And the klen isn't really being used for its value here. So, it is likely enough to have an ops->hwpt_type_is_supported. > > > > + 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. I don't think that's necessaray: the parent is NULL by default and only specified (if IOMMUFD_OBJ_HW_PAGETABLE) by the exact pt_id/pt_obj here. > > + 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. Jason suggested this for simplicity. As I replied in another email, a user hwpt still needs ioas's refcount and mutex, so it would otherwise have a duplicated code in the beginning of most of hwpt_ functions: if (hwpt->parent) ioas = hwpt->parent->ioas; else (hwpt->ioas) ioas = hwpt->ioas; else WARN_ON(1); Thanks Nic