Commit ec154bf5 authored by Joerg Roedel's avatar Joerg Roedel

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: default avatarJan Kiszka <jan.kiszka@siemens.com>
Fixes: 59ce0515 ('iommu/vt-d: Update DRHD/RMRR/ATSR device scope caches when PCI hotplug happens')
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 9e66317d
...@@ -801,13 +801,16 @@ int __init dmar_dev_scope_init(void) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment