From: Yi Liu yi.l.liu@intel.com 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_typeis !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 toauto_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.