OSDN Git Service

iommu/vt-d: Fix lockdep splat in sva bind()/unbind()
authorLu Baolu <baolu.lu@linux.intel.com>
Thu, 31 Dec 2020 00:53:23 +0000 (08:53 +0800)
committerWill Deacon <will@kernel.org>
Thu, 7 Jan 2021 13:27:14 +0000 (13:27 +0000)
commit420d42f6f9db27d88bc4f83e3e668fcdacbf7e29
treeddcf72e453546c473b7c81ae85733f1358b9e4fc
parent4df7b2268ad81a74168130e1fb04550a8bc980e1
iommu/vt-d: Fix lockdep splat in sva bind()/unbind()

Lock(&iommu->lock) without disabling irq causes lockdep warnings.

========================================================
WARNING: possible irq lock inversion dependency detected
5.11.0-rc1+ #828 Not tainted
--------------------------------------------------------
kworker/0:1H/120 just changed the state of lock:
ffffffffad9ea1b8 (device_domain_lock){..-.}-{2:2}, at:
iommu_flush_dev_iotlb.part.0+0x32/0x120
but this lock took another, SOFTIRQ-unsafe lock in the past:
 (&iommu->lock){+.+.}-{2:2}

and interrupts could create inverse lock ordering between them.

other info that might help us debug this:
 Possible interrupt unsafe locking scenario:

       CPU0                    CPU1
       ----                    ----
  lock(&iommu->lock);
                               local_irq_disable();
                               lock(device_domain_lock);
                               lock(&iommu->lock);
  <Interrupt>
    lock(device_domain_lock);

 *** DEADLOCK ***

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20201231005323.2178523-5-baolu.lu@linux.intel.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/intel/svm.c