iommu/vt-d: Don't register bus-notifier under dmar_global_lock
The notifier function will take the dmar_global_lock too, so
lockdep complains about inverse locking order when the
notifier is registered under the dmar_global_lock.
Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
Fixes: 59ce0515cd ('iommu/vt-d: Update DRHD/RMRR/ATSR device scope caches when PCI hotplug happens')
Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
@@ -801,13 +801,16 @@ int __init dmar_dev_scope_init(void)
|
|||||||
dmar_free_pci_notify_info(info);
|
dmar_free_pci_notify_info(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bus_register_notifier(&pci_bus_type, &dmar_pci_bus_nb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return dmar_dev_scope_status;
|
return dmar_dev_scope_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dmar_register_bus_notifier(void)
|
||||||
|
{
|
||||||
|
bus_register_notifier(&pci_bus_type, &dmar_pci_bus_nb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int __init dmar_table_init(void)
|
int __init dmar_table_init(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4752,6 +4752,16 @@ int __init intel_iommu_init(void)
|
|||||||
goto out_free_dmar;
|
goto out_free_dmar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
up_write(&dmar_global_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The bus notifier takes the dmar_global_lock, so lockdep will
|
||||||
|
* complain later when we register it under the lock.
|
||||||
|
*/
|
||||||
|
dmar_register_bus_notifier();
|
||||||
|
|
||||||
|
down_write(&dmar_global_lock);
|
||||||
|
|
||||||
if (no_iommu || dmar_disabled) {
|
if (no_iommu || dmar_disabled) {
|
||||||
/*
|
/*
|
||||||
* We exit the function here to ensure IOMMU's remapping and
|
* We exit the function here to ensure IOMMU's remapping and
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ static inline bool dmar_rcu_check(void)
|
|||||||
|
|
||||||
extern int dmar_table_init(void);
|
extern int dmar_table_init(void);
|
||||||
extern int dmar_dev_scope_init(void);
|
extern int dmar_dev_scope_init(void);
|
||||||
|
extern void dmar_register_bus_notifier(void);
|
||||||
extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
|
extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
|
||||||
struct dmar_dev_scope **devices, u16 segment);
|
struct dmar_dev_scope **devices, u16 segment);
|
||||||
extern void *dmar_alloc_dev_scope(void *start, void *end, int *cnt);
|
extern void *dmar_alloc_dev_scope(void *start, void *end, int *cnt);
|
||||||
|
|||||||
Reference in New Issue
Block a user