Lines Matching refs:igroup

28 	struct iommufd_group *igroup =  in iommufd_group_release()  local
31 WARN_ON(!xa_empty(&igroup->pasid_attach)); in iommufd_group_release()
33 xa_cmpxchg(&igroup->ictx->groups, iommu_group_id(igroup->group), igroup, in iommufd_group_release()
35 iommu_group_put(igroup->group); in iommufd_group_release()
36 mutex_destroy(&igroup->lock); in iommufd_group_release()
37 kfree(igroup); in iommufd_group_release()
45 static bool iommufd_group_try_get(struct iommufd_group *igroup, in iommufd_group_try_get() argument
48 if (!igroup) in iommufd_group_try_get()
54 if (WARN_ON(igroup->group != group)) in iommufd_group_try_get()
56 return kref_get_unless_zero(&igroup->ref); in iommufd_group_try_get()
71 struct iommufd_group *igroup; in iommufd_get_group() local
82 igroup = xa_load(&ictx->groups, id); in iommufd_get_group()
83 if (iommufd_group_try_get(igroup, group)) { in iommufd_get_group()
86 return igroup; in iommufd_get_group()
116 igroup = __xa_cmpxchg(&ictx->groups, id, cur_igroup, new_igroup, in iommufd_get_group()
118 if (xa_is_err(igroup)) { in iommufd_get_group()
121 return ERR_PTR(xa_err(igroup)); in iommufd_get_group()
125 if (cur_igroup == igroup) { in iommufd_get_group()
131 if (iommufd_group_try_get(igroup, group)) { in iommufd_get_group()
134 return igroup; in iommufd_get_group()
136 cur_igroup = igroup; in iommufd_get_group()
144 mutex_lock(&idev->igroup->lock); in iommufd_device_remove_vdev()
174 mutex_unlock(&idev->igroup->lock); in iommufd_device_remove_vdev()
179 mutex_unlock(&idev->igroup->lock); in iommufd_device_remove_vdev()
197 iommufd_put_group(idev->igroup); in iommufd_device_destroy()
222 struct iommufd_group *igroup; in iommufd_device_bind() local
232 igroup = iommufd_get_group(ictx, dev); in iommufd_device_bind()
233 if (IS_ERR(igroup)) in iommufd_device_bind()
234 return ERR_CAST(igroup); in iommufd_device_bind()
243 !iommu_group_has_isolated_msi(igroup->group)) { in iommufd_device_bind()
274 idev->igroup = igroup; in iommufd_device_bind()
289 iommufd_put_group(igroup); in iommufd_device_bind()
315 ->igroup->group == group) { in iommufd_ctx_has_group()
352 static unsigned int iommufd_group_device_num(struct iommufd_group *igroup, in iommufd_group_device_num() argument
360 lockdep_assert_held(&igroup->lock); in iommufd_group_device_num()
362 attach = xa_load(&igroup->pasid_attach, pasid); in iommufd_group_device_num()
370 static int iommufd_group_setup_msi(struct iommufd_group *igroup, in iommufd_group_setup_msi() argument
373 struct iommufd_ctx *ictx = igroup->ictx; in iommufd_group_setup_msi()
376 if (igroup->sw_msi_start == PHYS_ADDR_MAX) in iommufd_group_setup_msi()
386 if (cur->sw_msi_start != igroup->sw_msi_start || in iommufd_group_setup_msi()
387 !test_bit(cur->id, igroup->required_sw_msi.bitmap)) in iommufd_group_setup_msi()
398 iommufd_group_setup_msi(struct iommufd_group *igroup, in iommufd_group_setup_msi() argument
406 iommufd_group_first_attach(struct iommufd_group *igroup, ioasid_t pasid) in iommufd_group_first_attach() argument
408 lockdep_assert_held(&igroup->lock); in iommufd_group_first_attach()
409 return !xa_load(&igroup->pasid_attach, pasid); in iommufd_group_first_attach()
416 struct iommufd_group *igroup = idev->igroup; in iommufd_device_attach_reserved_iova() local
419 lockdep_assert_held(&igroup->lock); in iommufd_device_attach_reserved_iova()
423 &igroup->sw_msi_start); in iommufd_device_attach_reserved_iova()
427 if (iommufd_group_first_attach(igroup, IOMMU_NO_PASID)) { in iommufd_device_attach_reserved_iova()
428 rc = iommufd_group_setup_msi(igroup, hwpt_paging); in iommufd_device_attach_reserved_iova()
445 attach = xa_load(&idev->igroup->pasid_attach, pasid); in iommufd_device_is_attached()
453 struct iommufd_group *igroup = idev->igroup; in iommufd_hwpt_pasid_compat() local
455 lockdep_assert_held(&igroup->lock); in iommufd_hwpt_pasid_compat()
461 xa_find_after(&igroup->pasid_attach, in iommufd_hwpt_pasid_compat()
470 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID); in iommufd_hwpt_pasid_compat()
517 rc = iommu_attach_group_handle(hwpt->domain, idev->igroup->group, in iommufd_hwpt_attach_device()
537 lockdep_assert_held(&idev->igroup->lock); in iommufd_device_get_attach_handle()
539 handle = iommu_attach_handle_get(idev->igroup->group, pasid, 0); in iommufd_device_get_attach_handle()
553 iommu_detach_group_handle(hwpt->domain, idev->igroup->group); in iommufd_hwpt_detach_device()
584 rc = iommu_replace_group_handle(idev->igroup->group, in iommufd_hwpt_replace_device()
607 struct iommufd_group *igroup = idev->igroup; in iommufd_hw_pagetable_attach() local
612 mutex_lock(&igroup->lock); in iommufd_hw_pagetable_attach()
614 attach = xa_cmpxchg(&igroup->pasid_attach, pasid, NULL, in iommufd_hw_pagetable_attach()
657 if (iommufd_group_first_attach(igroup, pasid)) { in iommufd_hw_pagetable_attach()
662 WARN_ON(xa_is_err(xa_store(&igroup->pasid_attach, pasid, attach, in iommufd_hw_pagetable_attach()
668 mutex_unlock(&igroup->lock); in iommufd_hw_pagetable_attach()
676 if (iommufd_group_first_attach(igroup, pasid)) in iommufd_hw_pagetable_attach()
679 if (iommufd_group_first_attach(igroup, pasid)) in iommufd_hw_pagetable_attach()
680 xa_release(&igroup->pasid_attach, pasid); in iommufd_hw_pagetable_attach()
682 mutex_unlock(&igroup->lock); in iommufd_hw_pagetable_attach()
689 struct iommufd_group *igroup = idev->igroup; in iommufd_hw_pagetable_detach() local
694 mutex_lock(&igroup->lock); in iommufd_hw_pagetable_detach()
695 attach = xa_load(&igroup->pasid_attach, pasid); in iommufd_hw_pagetable_detach()
697 mutex_unlock(&igroup->lock); in iommufd_hw_pagetable_detach()
707 xa_erase(&igroup->pasid_attach, pasid); in iommufd_hw_pagetable_detach()
712 mutex_unlock(&igroup->lock); in iommufd_hw_pagetable_detach()
731 iommufd_group_remove_reserved_iova(struct iommufd_group *igroup, in iommufd_group_remove_reserved_iova() argument
738 lockdep_assert_held(&igroup->lock); in iommufd_group_remove_reserved_iova()
740 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID); in iommufd_group_remove_reserved_iova()
746 iommufd_group_do_replace_reserved_iova(struct iommufd_group *igroup, in iommufd_group_do_replace_reserved_iova() argument
755 lockdep_assert_held(&igroup->lock); in iommufd_group_do_replace_reserved_iova()
757 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID); in iommufd_group_do_replace_reserved_iova()
768 rc = iommufd_group_setup_msi(igroup, hwpt_paging); in iommufd_group_do_replace_reserved_iova()
774 iommufd_group_remove_reserved_iova(igroup, hwpt_paging); in iommufd_group_do_replace_reserved_iova()
785 struct iommufd_group *igroup = idev->igroup; in iommufd_device_do_replace() local
791 mutex_lock(&igroup->lock); in iommufd_device_do_replace()
793 attach = xa_load(&igroup->pasid_attach, pasid); in iommufd_device_do_replace()
809 mutex_unlock(&igroup->lock); in iommufd_device_do_replace()
814 rc = iommufd_group_do_replace_reserved_iova(igroup, hwpt_paging); in iommufd_device_do_replace()
826 iommufd_group_remove_reserved_iova(igroup, old_hwpt_paging); in iommufd_device_do_replace()
830 num_devices = iommufd_group_device_num(igroup, pasid); in iommufd_device_do_replace()
839 mutex_unlock(&igroup->lock); in iommufd_device_do_replace()
845 iommufd_group_remove_reserved_iova(igroup, hwpt_paging); in iommufd_device_do_replace()
847 mutex_unlock(&igroup->lock); in iommufd_device_do_replace()