iommu/vt-d: Fix lockdep splat in iommu_flush_dev_iotlb()
Subsystems (2)
Lu Baolu
maintainerPATCH 1/1 iommu/vt-d: Fix lockdep splat in iommu_flush_dev_iotlb()
Lock(&iommu->lock) without disabling irq causes lockdep warnings.
[ 12.703950] ========================================================
[ 12.703962] WARNING: possible irq lock inversion dependency detected
[ 12.703975] 5.9.0-rc6+ #659 Not tainted
[ 12.703983] --------------------------------------------------------
[ 12.703995] systemd-udevd/284 just changed the state of lock:
[ 12.704007] ffffffffbd6ff4d8 (device_domain_lock){..-.}-{2:2}, at:
iommu_flush_dev_iotlb.part.57+0x2e/0x90
[ 12.704031] but this lock took another, SOFTIRQ-unsafe lock in the past:
[ 12.704043] (&iommu->lock){+.+.}-{2:2}
[ 12.704045]and interrupts could create inverse lock ordering between them.
[ 12.704073]
other info that might help us debug this:
[ 12.704085] Possible interrupt unsafe locking scenario:[ 12.704097] CPU0 CPU1
[ 12.704106] ---- ----
[ 12.704115] lock(&iommu->lock);
[ 12.704123] local_irq_disable();
[ 12.704134] lock(device_domain_lock);
[ 12.704146] lock(&iommu->lock);
[ 12.704158] <Interrupt>
[ 12.704164] lock(device_domain_lock);
[ 12.704174]
*** DEADLOCK ***Signed-off-by Lu Baolu <[email protected]>
--- drivers/iommu/intel/iommu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iommu/intel/iommu.c +2 -2
@@ -2699,7 +2699,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu, }/* Setup the PASID entry for requests without PASID: */ -spin_lock (&iommu->lock); +spin_lock_irqsave (&iommu->lock, flags);if (hw_pass_through &&domain_type_is_si (domain)) ret =intel_pasid_setup_pass_through (iommu, domain, dev,PASID_RID2PASID );
@@ -2709,7 +2709,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,else ret =intel_pasid_setup_second_level (iommu, domain, dev,PASID_RID2PASID ); -spin_unlock (&iommu->lock); +spin_unlock_irqrestore (&iommu->lock, flags);if (ret) {dev_err (dev,"Setup RID2PASID failed\n" );dmar_remove_one_dev_info (dev);
Signature · 1 line
2.17.1
Joerg Roedel
maintainerQuoted 2 lines · Lu Baolu
drivers/iommu/intel/iommu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Applied for v5.9, thanks.