Skip to content

Commit

Permalink
iommu/vt-d: fix wrong return value of dmar_table_init()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jiang Liu authored and Joerg Roedel committed Jan 9, 2014
1 parent a84da70 commit cc05301
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions drivers/iommu/dmar.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit cc05301

Please sign in to comment.