]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/amd: Fix failure return from snp_lookup_rmpentry()
authorAshish Kalra <ashish.kalra@amd.com>
Mon, 5 Feb 2024 21:06:54 +0000 (21:06 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Wed, 7 Feb 2024 16:27:03 +0000 (17:27 +0100)
Commit

  f366a8dac1b8: ("iommu/amd: Clean up RMP entries for IOMMU pages during SNP shutdown")

leads to the following Smatch static checker warning:

  drivers/iommu/amd/init.c:3820 iommu_page_make_shared() error: uninitialized symbol 'assigned'.

Fix it.

  [ bp: Address the other error cases too. ]

Fixes: f366a8dac1b8 ("iommu/amd: Clean up RMP entries for IOMMU pages during SNP shutdown")
Closes: https://lore.kernel.org/linux-iommu/1be69f6a-e7e1-45f9-9a74-b2550344f3fd@moroto.mountain
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Cc: Joerg Roedel <jroedel@suse.com>
Link: https://lore.kernel.org/lkml/20240126041126.1927228-20-michael.roth@amd.com
drivers/iommu/amd/init.c

index 88bb08ae39b2bab56c5cb20d4ad51ede69e9d7a0..480e7681f4f3869f9e03540d195f3dfd82f16f85 100644 (file)
@@ -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);
 }