Commit 82678ab2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'iommu-fixes-v6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu

Pull iommu fixes from Joerg Roedel:

 - Fix a regression causing a crash on sysfs access of iommu-group
   specific files

 - Fix signedness bug in SVA code

* tag 'iommu-fixes-v6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
  iommu/sva: Fix signedness bug in iommu_sva_alloc_pasid()
  iommu: Fix crash during syfs iommu_groups/N/type
parents b6e6cc1f c20ecf7b
...@@ -34,8 +34,9 @@ static int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t ma ...@@ -34,8 +34,9 @@ static int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t ma
} }
ret = ida_alloc_range(&iommu_global_pasid_ida, min, max, GFP_KERNEL); ret = ida_alloc_range(&iommu_global_pasid_ida, min, max, GFP_KERNEL);
if (ret < min) if (ret < 0)
goto out; goto out;
mm->pasid = ret; mm->pasid = ret;
ret = 0; ret = 0;
out: out:
......
...@@ -2891,14 +2891,11 @@ static int iommu_setup_default_domain(struct iommu_group *group, ...@@ -2891,14 +2891,11 @@ static int iommu_setup_default_domain(struct iommu_group *group,
ret = __iommu_group_set_domain_internal( ret = __iommu_group_set_domain_internal(
group, dom, IOMMU_SET_DOMAIN_MUST_SUCCEED); group, dom, IOMMU_SET_DOMAIN_MUST_SUCCEED);
if (WARN_ON(ret)) if (WARN_ON(ret))
goto out_free; goto out_free_old;
} else { } else {
ret = __iommu_group_set_domain(group, dom); ret = __iommu_group_set_domain(group, dom);
if (ret) { if (ret)
iommu_domain_free(dom); goto err_restore_def_domain;
group->default_domain = old_dom;
return ret;
}
} }
/* /*
...@@ -2911,20 +2908,24 @@ static int iommu_setup_default_domain(struct iommu_group *group, ...@@ -2911,20 +2908,24 @@ static int iommu_setup_default_domain(struct iommu_group *group,
for_each_group_device(group, gdev) { for_each_group_device(group, gdev) {
ret = iommu_create_device_direct_mappings(dom, gdev->dev); ret = iommu_create_device_direct_mappings(dom, gdev->dev);
if (ret) if (ret)
goto err_restore; goto err_restore_domain;
} }
} }
err_restore: out_free_old:
if (old_dom) { if (old_dom)
iommu_domain_free(old_dom);
return ret;
err_restore_domain:
if (old_dom)
__iommu_group_set_domain_internal( __iommu_group_set_domain_internal(
group, old_dom, IOMMU_SET_DOMAIN_MUST_SUCCEED); group, old_dom, IOMMU_SET_DOMAIN_MUST_SUCCEED);
err_restore_def_domain:
if (old_dom) {
iommu_domain_free(dom); iommu_domain_free(dom);
old_dom = NULL; group->default_domain = old_dom;
} }
out_free:
if (old_dom)
iommu_domain_free(old_dom);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment