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_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.