Lines Matching refs:igroup

28 	struct iommufd_group *igroup =
31 WARN_ON(!xa_empty(&igroup->pasid_attach));
33 xa_cmpxchg(&igroup->ictx->groups, iommu_group_id(igroup->group), igroup,
35 iommu_group_put(igroup->group);
36 mutex_destroy(&igroup->lock);
37 kfree(igroup);
45 static bool iommufd_group_try_get(struct iommufd_group *igroup,
48 if (!igroup)
52 * not happen if we could get an igroup pointer under the xa_lock.
54 if (WARN_ON(igroup->group != group))
56 return kref_get_unless_zero(&igroup->ref);
71 struct iommufd_group *igroup;
82 igroup = xa_load(&ictx->groups, id);
83 if (iommufd_group_try_get(igroup, group)) {
86 return igroup;
105 * an igroup must put it before their destroy completes.
110 * We dropped the lock so igroup is invalid. NULL is a safe and likely
116 igroup = __xa_cmpxchg(&ictx->groups, id, cur_igroup, new_igroup,
118 if (xa_is_err(igroup)) {
121 return ERR_PTR(xa_err(igroup));
125 if (cur_igroup == igroup) {
131 if (iommufd_group_try_get(igroup, group)) {
134 return igroup;
136 cur_igroup = igroup;
144 mutex_lock(&idev->igroup->lock);
174 mutex_unlock(&idev->igroup->lock);
179 mutex_unlock(&idev->igroup->lock);
197 iommufd_put_group(idev->igroup);
222 struct iommufd_group *igroup;
232 igroup = iommufd_get_group(ictx, dev);
233 if (IS_ERR(igroup))
234 return ERR_CAST(igroup);
243 !iommu_group_has_isolated_msi(igroup->group)) {
273 /* igroup refcount moves into iommufd_device */
274 idev->igroup = igroup;
289 iommufd_put_group(igroup);
315 ->igroup->group == group) {
352 static unsigned int iommufd_group_device_num(struct iommufd_group *igroup,
360 lockdep_assert_held(&igroup->lock);
362 attach = xa_load(&igroup->pasid_attach, pasid);
370 static int iommufd_group_setup_msi(struct iommufd_group *igroup,
373 struct iommufd_ctx *ictx = igroup->ictx;
376 if (igroup->sw_msi_start == PHYS_ADDR_MAX)
386 if (cur->sw_msi_start != igroup->sw_msi_start ||
387 !test_bit(cur->id, igroup->required_sw_msi.bitmap))
398 iommufd_group_setup_msi(struct iommufd_group *igroup,
406 iommufd_group_first_attach(struct iommufd_group *igroup, ioasid_t pasid)
408 lockdep_assert_held(&igroup->lock);
409 return !xa_load(&igroup->pasid_attach, pasid);
416 struct iommufd_group *igroup = idev->igroup;
419 lockdep_assert_held(&igroup->lock);
423 &igroup->sw_msi_start);
427 if (iommufd_group_first_attach(igroup, IOMMU_NO_PASID)) {
428 rc = iommufd_group_setup_msi(igroup, hwpt_paging);
445 attach = xa_load(&idev->igroup->pasid_attach, pasid);
453 struct iommufd_group *igroup = idev->igroup;
455 lockdep_assert_held(&igroup->lock);
461 xa_find_after(&igroup->pasid_attach,
470 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID);
517 rc = iommu_attach_group_handle(hwpt->domain, idev->igroup->group,
537 lockdep_assert_held(&idev->igroup->lock);
539 handle = iommu_attach_handle_get(idev->igroup->group, pasid, 0);
553 iommu_detach_group_handle(hwpt->domain, idev->igroup->group);
584 rc = iommu_replace_group_handle(idev->igroup->group,
607 struct iommufd_group *igroup = idev->igroup;
612 mutex_lock(&igroup->lock);
614 attach = xa_cmpxchg(&igroup->pasid_attach, pasid, NULL,
657 if (iommufd_group_first_attach(igroup, pasid)) {
662 WARN_ON(xa_is_err(xa_store(&igroup->pasid_attach, pasid, attach,
668 mutex_unlock(&igroup->lock);
676 if (iommufd_group_first_attach(igroup, pasid))
679 if (iommufd_group_first_attach(igroup, pasid))
680 xa_release(&igroup->pasid_attach, pasid);
682 mutex_unlock(&igroup->lock);
689 struct iommufd_group *igroup = idev->igroup;
694 mutex_lock(&igroup->lock);
695 attach = xa_load(&igroup->pasid_attach, pasid);
697 mutex_unlock(&igroup->lock);
707 xa_erase(&igroup->pasid_attach, pasid);
712 mutex_unlock(&igroup->lock);
731 iommufd_group_remove_reserved_iova(struct iommufd_group *igroup,
738 lockdep_assert_held(&igroup->lock);
740 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID);
746 iommufd_group_do_replace_reserved_iova(struct iommufd_group *igroup,
755 lockdep_assert_held(&igroup->lock);
757 attach = xa_load(&igroup->pasid_attach, IOMMU_NO_PASID);
768 rc = iommufd_group_setup_msi(igroup, hwpt_paging);
774 iommufd_group_remove_reserved_iova(igroup, hwpt_paging);
785 struct iommufd_group *igroup = idev->igroup;
791 mutex_lock(&igroup->lock);
793 attach = xa_load(&igroup->pasid_attach, pasid);
809 mutex_unlock(&igroup->lock);
814 rc = iommufd_group_do_replace_reserved_iova(igroup, hwpt_paging);
826 iommufd_group_remove_reserved_iova(igroup, old_hwpt_paging);
830 num_devices = iommufd_group_device_num(igroup, pasid);
839 mutex_unlock(&igroup->lock);
845 iommufd_group_remove_reserved_iova(igroup, hwpt_paging);
847 mutex_unlock(&igroup->lock);