• Lu Baolu's avatar
    iommu/vt-d: Fix recursive lock issue in iommu_flush_dev_iotlb() · a349ffcb
    Lu Baolu authored
    The per domain spinlock is acquired in iommu_flush_dev_iotlb(), which
    is possbile to be called in the interrupt context. For example, the
    drm-intel's CI system got completely blocked with below error:
    
     WARNING: inconsistent lock state
     6.0.0-rc1-CI_DRM_11990-g6590d43d39b9+ #1 Not tainted
     --------------------------------
     inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
     swapper/6/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
     ffff88810440d678 (&domain->lock){+.?.}-{2:2}, at: iommu_flush_dev_iotlb.part.61+0x23/0x80
     {SOFTIRQ-ON-W} state was registered at:
       lock_acquire+0xd3/0x310
       _raw_spin_lock+0x2a/0x40
       domain_update_iommu_cap+0x20b/0x2c0
       intel_iommu_attach_device+0x5bd/0x860
       __iommu_attach_device+0x18/0xe0
       bus_iommu_probe+0x1f3/0x2d0
       bus_set_iommu+0x82/0xd0
       intel_iommu_init+0xe45/0x102a
       pci_iommu_init+0x9/0x31
       do_one_initcall+0x53/0x2f0
       kernel_init_freeable+0x18f/0x1e1
       kernel_init+0x11/0x120
       ret_from_fork+0x1f/0x30
     irq event stamp: 162354
     hardirqs last  enabled at (162354): [<ffffffff81b59274>] _raw_spin_unlock_irqrestore+0x54/0x70
     hardirqs last disabled at (162353): [<ffffffff81b5901b>] _raw_spin_lock_irqsave+0x4b/0x50
     softirqs last  enabled at (162338): [<ffffffff81e00323>] __do_softirq+0x323/0x48e
     softirqs last disabled at (162349): [<ffffffff810c1588>] irq_exit_rcu+0xb8/0xe0
     other info that might help us debug this:
      Possible unsafe locking scenario:
            CPU0
            ----
       lock(&domain->lock);
       <Interrupt>
         lock(&domain->lock);
       *** DEADLOCK ***
     1 lock held by swapper/6/0:
    
    This coverts the spin_lock/unlock() into the irq save/restore varieties
    to fix the recursive locking issues.
    
    Fixes: ffd5869d ("iommu/vt-d: Replace spin_lock_irqsave() with spin_lock()")
    Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Acked-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
    Link: https://lore.kernel.org/r/20220817025650.3253959-1-baolu.lu@linux.intel.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    a349ffcb
iommu.c 126 KB