PCI: Lock upstream bridge for pci_reset_function()
authorDave Jiang <dave.jiang@intel.com>
Thu, 2 May 2024 16:57:31 +0000 (09:57 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 8 May 2024 18:19:20 +0000 (13:19 -0500)
commit7e89efc6e9e402839643cb297bab14055c547f07
treea3dd3510c8f20c5458a7847af081ab5a393eedda
parent962f1e79e7acfb30207a378894b1bbf6742e6212
PCI: Lock upstream bridge for pci_reset_function()

Fix a long-standing locking gap for missing pci_cfg_access_lock() while
manipulating bridge reset registers and configuration during
pci_reset_bus_function().

If there is an upstream bridge, lock it before locking the device itself.
pci_dev_lock() calls pci_cfg_access_lock(), which blocks the writing of PCI
config space by user space.

Add lockdep assertion via pci_dev->cfg_access_lock to verify
pci_dev->block_cfg_access is set.

Co-developed-by: Dan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/r/20240502165851.1948523-3-dave.jiang@intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/access.c
drivers/pci/pci.c
drivers/pci/probe.c
include/linux/lockdep.h
include/linux/pci.h