> From: Liu, Yi L <yi.l.liu@xxxxxxxxx> > Sent: Thursday, September 21, 2023 3:51 PM > > +static void iommufd_user_managed_hwpt_abort(struct iommufd_object > *obj) > +{ > + struct iommufd_hw_pagetable *hwpt = > + container_of(obj, struct iommufd_hw_pagetable, obj); > + > + /* The parent->mutex must be held until finalize is called. */ > + lockdep_assert_held(&hwpt->parent->mutex); > + > + iommufd_hw_pagetable_destroy(obj); > +} Can you elaborate what exactly is protected by parent->mutex? My gut-feeling that the child just grabs a refcnt on the parent object. It doesn't change any other data of the parent. > > +/** > + * iommufd_user_managed_hwpt_alloc() - Get a user-managed > hw_pagetable > + * @ictx: iommufd context > + * @pt_obj: Parent object to an HWPT to associate the domain with > + * @idev: Device to get an iommu_domain for > + * @flags: Flags from userspace > + * @hwpt_type: Requested type of hw_pagetable > + * @user_data: user_data pointer > + * @dummy: never used > + * > + * Allocate a new iommu_domain (must be IOMMU_DOMAIN_NESTED) and > return it as > + * a user-managed hw_pagetable. Add some text to highlight the requirement being a parent, e.g. not an auto domain, must be capable of being a parent, etc. > + case IOMMUFD_OBJ_HW_PAGETABLE: > + parent = container_of(pt_obj, struct iommufd_hw_pagetable, > obj); > + /* No user-managed HWPT on top of an user-managed one > */ > + if (parent->user_managed) { > + rc = -EINVAL; > + goto out_put_pt; > + } move to alloc_fn().