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@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?
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