| From aa9175d9e039e54d9e2fae7055f7d117267d991e Mon Sep 17 00:00:00 2001 |
| From: Qian Cai <cai@lca.pw> |
| Date: Tue, 17 Mar 2020 11:03:26 -0400 |
| Subject: [PATCH] iommu/vt-d: Silence RCU-list debugging warning in |
| dmar_find_atsr() |
| |
| commit c6f4ebdeba4cff590594df931ff1ee610c426431 upstream. |
| |
| dmar_find_atsr() calls list_for_each_entry_rcu() outside of an RCU read |
| side critical section but with dmar_global_lock held. Silence this |
| false positive. |
| |
| drivers/iommu/intel-iommu.c:4504 RCU-list traversed in non-reader section!! |
| 1 lock held by swapper/0/1: |
| #0: ffffffff9755bee8 (dmar_global_lock){+.+.}, at: intel_iommu_init+0x1a6/0xe19 |
| |
| Call Trace: |
| dump_stack+0xa4/0xfe |
| lockdep_rcu_suspicious+0xeb/0xf5 |
| dmar_find_atsr+0x1ab/0x1c0 |
| dmar_parse_one_atsr+0x64/0x220 |
| dmar_walk_remapping_entries+0x130/0x380 |
| dmar_table_init+0x166/0x243 |
| intel_iommu_init+0x1ab/0xe19 |
| pci_iommu_init+0x1a/0x44 |
| do_one_initcall+0xae/0x4d0 |
| kernel_init_freeable+0x412/0x4c5 |
| kernel_init+0x19/0x193 |
| |
| Signed-off-by: Qian Cai <cai@lca.pw> |
| Acked-by: Lu Baolu <baolu.lu@linux.intel.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
| index 6722d93074e0..fc742ddf7197 100644 |
| --- a/drivers/iommu/intel-iommu.c |
| +++ b/drivers/iommu/intel-iommu.c |
| @@ -4244,7 +4244,8 @@ static struct dmar_atsr_unit *dmar_find_atsr(struct acpi_dmar_atsr *atsr) |
| struct dmar_atsr_unit *atsru; |
| struct acpi_dmar_atsr *tmp; |
| |
| - list_for_each_entry_rcu(atsru, &dmar_atsr_units, list) { |
| + list_for_each_entry_rcu(atsru, &dmar_atsr_units, list, |
| + dmar_rcu_check()) { |
| tmp = (struct acpi_dmar_atsr *)atsru->hdr; |
| if (atsr->segment != tmp->segment) |
| continue; |
| -- |
| 2.7.4 |
| |