• Bjorn Helgaas's avatar
    PCI: Avoid possible deadlock on pci_lock and p->pi_lock · cdcb33f9
    Bjorn Helgaas authored
    pci_lock is an IRQ-safe spinlock that protects all accesses to PCI
    configuration space (see PCI_OP_READ() and PCI_OP_WRITE() in pci/access.c).
    
    The pci_cfg_access_unlock() path acquires pci_lock, then p->pi_lock (inside
    wake_up_all()).  According to lockdep, there is a possible path involving
    snbep_uncore_pci_read_counter() that could acquire them in the reverse
    order: acquiring p->pi_lock, then pci_lock, which could result in a
    deadlock.  Lockdep details are in the bugzilla below.
    
    Avoid the possible deadlock by dropping pci_lock before waking up any
    config access waiters.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=192901Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    cdcb33f9
access.c 20.9 KB