• Johan Hovold's avatar
    PCI: qcom: Fix potential deadlock when enabling ASPM · f352ce99
    Johan Hovold authored
    The qcom_pcie_enable_aspm() helper is called from pci_walk_bus() during
    host init to enable ASPM.
    
    Since pci_walk_bus() already holds a pci_bus_sem read lock, use
    pci_enable_link_state_locked() to enable link states in order to avoid a
    potential deadlock (e.g. in case someone takes a write lock before
    reacquiring the read lock).
    
    This issue was reported by lockdep:
    
      ============================================
      WARNING: possible recursive locking detected
      6.7.0-rc1 #4 Not tainted
      --------------------------------------------
      kworker/u16:6/147 is trying to acquire lock:
      ffffbf3ff9d2cfa0 (pci_bus_sem){++++}-{3:3}, at: pci_enable_link_state+0x74/0x1e8
    
      but task is already holding lock:
      ffffbf3ff9d2cfa0 (pci_bus_sem){++++}-{3:3}, at: pci_walk_bus+0x34/0xbc
    
      other info that might help us debug this:
       Possible unsafe locking scenario:
    
             CPU0
             ----
        lock(pci_bus_sem);
        lock(pci_bus_sem);
    
       *** DEADLOCK ***
    
    Fixes: 9f4f3dfa ("PCI: qcom: Enable ASPM for platforms supporting 1.9.0 ops")
    Link: https://lore.kernel.org/r/20231128081512.19387-4-johan+linaro@kernel.orgSigned-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    [bhelgaas: add "potential" in subject since the deadlock has only been
    reported by lockdep, include helper name in commit log]
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    f352ce99
pcie-qcom.c 43.4 KB