aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/iommu/amd/init.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 88bb08ae39b2..480e7681f4f3 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -3813,23 +3813,28 @@ static int iommu_page_make_shared(void *page)
bool assigned;
ret = snp_lookup_rmpentry(pfn, &assigned, &level);
- if (ret)
- pr_warn("IOMMU PFN %lx RMP lookup failed, ret %d\n",
- pfn, ret);
+ if (ret) {
+ pr_warn("IOMMU PFN %lx RMP lookup failed, ret %d\n", pfn, ret);
+ return ret;
+ }
- if (!assigned)
- pr_warn("IOMMU PFN %lx not assigned in RMP table\n",
- pfn);
+ if (!assigned) {
+ pr_warn("IOMMU PFN %lx not assigned in RMP table\n", pfn);
+ return -EINVAL;
+ }
if (level > PG_LEVEL_4K) {
ret = psmash(pfn);
- if (ret) {
- pr_warn("IOMMU PFN %lx had a huge RMP entry, but attempted psmash failed, ret: %d, level: %d\n",
- pfn, ret, level);
- }
+ if (!ret)
+ goto done;
+
+ pr_warn("PSMASH failed for IOMMU PFN %lx huge RMP entry, ret: %d, level: %d\n",
+ pfn, ret, level);
+ return ret;
}
}
+done:
return rmp_make_shared(pfn, PG_LEVEL_4K);
}