iommu/vt-d: fix wrong return value of dmar_table_init()
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>
This commit is contained in:
Родитель
a84da70b7b
Коммит
cc05301fd5
|
@ -472,24 +472,23 @@ int __init dmar_table_init(void)
|
|||
static int dmar_table_initialized;
|
||||
int ret;
|
||||
|
||||
if (dmar_table_initialized)
|
||||
return 0;
|
||||
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;
|
||||
}
|
||||
|
||||
dmar_table_initialized = 1;
|
||||
|
||||
ret = parse_dmar_table();
|
||||
if (ret) {
|
||||
if (ret != -ENODEV)
|
||||
pr_info("parse DMAR table failure.\n");
|
||||
return ret;
|
||||
if (ret < 0)
|
||||
dmar_table_initialized = ret;
|
||||
else
|
||||
dmar_table_initialized = 1;
|
||||
}
|
||||
|
||||
if (list_empty(&dmar_drhd_units)) {
|
||||
pr_info("No DMAR devices found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return dmar_table_initialized < 0 ? dmar_table_initialized : 0;
|
||||
}
|
||||
|
||||
static void warn_invalid_dmar(u64 addr, const char *message)
|
||||
|
|
Загрузка…
Ссылка в новой задаче