On Sun, Apr 28, 2024 at 06:22:28PM +0800, Baolu Lu wrote: > /* A bond already exists, just take a reference`. */ > handle = iommu_attach_handle_get(group, iommu_mm->pasid); > if (handle) { > if (handle->domain->iopf_handler != iommu_sva_iopf_handler) > { > ret = -EBUSY; > goto out_unlock; > } > > refcount_inc(&handle->users); > mutex_unlock(&iommu_sva_lock); > return handle; > } > > But it appears that this code is not lock safe. If the domain on the > PASID is not a SVA domain, the check of "handle->domain->iopf_handler != > iommu_sva_iopf_handler" could result in a use-after-free issue as the > other thread might detach the domain in between the fetch and check > lines. For the above you just need to pass in the iommu_sva_iopf_handler as an argument to attach_handle_get() and have it check it under the xa_lock. The whole thing is already protected under the ugly sva_lock. Ideally it would be protected by the group mutex.. Jason