]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
iommu/vt-d: fix wrong return value of dmar_table_init()
authorJiang Liu <jiang.liu@linux.intel.com>
Mon, 6 Jan 2014 06:18:24 +0000 (14:18 +0800)
committerJoerg Roedel <joro@8bytes.org>
Thu, 9 Jan 2014 11:43:45 +0000 (12:43 +0100)
If dmar_table_init() fails to detect DMAR table on the first call,
it will return wrong result on following calls because it always
sets dmar_table_initialized no matter if succeeds or fails to
detect DMAR table.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
drivers/iommu/dmar.c

index 726cfe296d9909197a44f3a622b5f9e6d2e435a9..753c7ecf66a80fb0560d1110c72b4f7ec193a6c4 100644 (file)
@@ -472,24 +472,23 @@ int __init dmar_table_init(void)
        static int dmar_table_initialized;
        int ret;
 
-       if (dmar_table_initialized)
-               return 0;
-
-       dmar_table_initialized = 1;
-
-       ret = parse_dmar_table();
-       if (ret) {
-               if (ret != -ENODEV)
-                       pr_info("parse DMAR table failure.\n");
-               return ret;
-       }
+       if (dmar_table_initialized == 0) {
+               ret = parse_dmar_table();
+               if (ret < 0) {
+                       if (ret != -ENODEV)
+                               pr_info("parse DMAR table failure.\n");
+               } else  if (list_empty(&dmar_drhd_units)) {
+                       pr_info("No DMAR devices found\n");
+                       ret = -ENODEV;
+               }
 
-       if (list_empty(&dmar_drhd_units)) {
-               pr_info("No DMAR devices found\n");
-               return -ENODEV;
+               if (ret < 0)
+                       dmar_table_initialized = ret;
+               else
+                       dmar_table_initialized = 1;
        }
 
-       return 0;
+       return dmar_table_initialized < 0 ? dmar_table_initialized : 0;
 }
 
 static void warn_invalid_dmar(u64 addr, const char *message)