Lines Matching refs:igroup
22 struct iommufd_group *igroup =
25 WARN_ON(igroup->hwpt || !list_empty(&igroup->device_list));
27 xa_cmpxchg(&igroup->ictx->groups, iommu_group_id(igroup->group), igroup,
29 iommu_group_put(igroup->group);
30 mutex_destroy(&igroup->lock);
31 kfree(igroup);
39 static bool iommufd_group_try_get(struct iommufd_group *igroup,
42 if (!igroup)
46 * not happen if we could get an igroup pointer under the xa_lock.
48 if (WARN_ON(igroup->group != group))
50 return kref_get_unless_zero(&igroup->ref);
65 struct iommufd_group *igroup;
76 igroup = xa_load(&ictx->groups, id);
77 if (iommufd_group_try_get(igroup, group)) {
80 return igroup;
99 * an igroup must put it before their destroy completes.
104 * We dropped the lock so igroup is invalid. NULL is a safe and likely
110 igroup = __xa_cmpxchg(&ictx->groups, id, cur_igroup, new_igroup,
112 if (xa_is_err(igroup)) {
115 return ERR_PTR(xa_err(igroup));
119 if (cur_igroup == igroup) {
125 if (iommufd_group_try_get(igroup, group)) {
128 return igroup;
130 cur_igroup = igroup;
140 iommufd_put_group(idev->igroup);
165 struct iommufd_group *igroup;
175 igroup = iommufd_get_group(ictx, dev);
176 if (IS_ERR(igroup))
177 return ERR_CAST(igroup);
186 !iommu_group_has_isolated_msi(igroup->group)) {
216 /* igroup refcount moves into iommufd_device */
217 idev->igroup = igroup;
232 iommufd_put_group(igroup);
258 ->igroup->group == group) {
295 static int iommufd_group_setup_msi(struct iommufd_group *igroup,
298 phys_addr_t sw_msi_start = igroup->sw_msi_start;
333 mutex_lock(&idev->igroup->lock);
335 if (idev->igroup->hwpt != NULL && idev->igroup->hwpt != hwpt) {
348 &idev->igroup->sw_msi_start);
359 if (list_empty(&idev->igroup->device_list)) {
360 rc = iommufd_group_setup_msi(idev->igroup, hwpt);
364 rc = iommu_attach_group(hwpt->domain, idev->igroup->group);
367 idev->igroup->hwpt = hwpt;
370 list_add_tail(&idev->group_item, &idev->igroup->device_list);
371 mutex_unlock(&idev->igroup->lock);
376 mutex_unlock(&idev->igroup->lock);
383 struct iommufd_hw_pagetable *hwpt = idev->igroup->hwpt;
385 mutex_lock(&idev->igroup->lock);
387 if (list_empty(&idev->igroup->device_list)) {
388 iommu_detach_group(hwpt->domain, idev->igroup->group);
389 idev->igroup->hwpt = NULL;
392 mutex_unlock(&idev->igroup->lock);
414 struct iommufd_group *igroup = idev->igroup;
420 mutex_lock(&idev->igroup->lock);
422 if (igroup->hwpt == NULL) {
427 if (hwpt == igroup->hwpt) {
428 mutex_unlock(&idev->igroup->lock);
433 list_for_each_entry(cur, &igroup->device_list, group_item) {
442 old_hwpt = igroup->hwpt;
444 list_for_each_entry(cur, &igroup->device_list, group_item) {
452 rc = iommufd_group_setup_msi(idev->igroup, hwpt);
456 rc = iommu_group_replace_domain(igroup->group, hwpt->domain);
461 list_for_each_entry(cur, &igroup->device_list, group_item)
466 igroup->hwpt = hwpt;
476 mutex_unlock(&idev->igroup->lock);
481 list_for_each_entry(cur, &igroup->device_list, group_item)
484 mutex_unlock(&idev->igroup->lock);