]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commit
PCI: Probe bridge window attributes once at enumeration-time
authorBjorn Helgaas <bhelgaas@google.com>
Sat, 19 Jan 2019 17:35:04 +0000 (11:35 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 22 Jan 2019 18:56:35 +0000 (12:56 -0600)
commit51c48b310183ab6ba5419edfc6a8de889cc04521
tree3492cf9bfc81f046cd3259ee48d6d55231086b8a
parentbfeffd155283772bbe78c6a05dec7c0128ee500c
PCI: Probe bridge window attributes once at enumeration-time

pci_bridge_check_ranges() determines whether a bridge supports the optional
I/O and prefetchable memory windows and sets the flag bits in the bridge
resources.  This *could* be done once during enumeration except that the
resource allocation code completely clears the flag bits, e.g., in the
pci_assign_unassigned_bridge_resources() path.

The problem with pci_bridge_check_ranges() in the resource allocation path
is that we may allocate resources after devices have been claimed by
drivers, and pci_bridge_check_ranges() *changes* the window registers to
determine whether they're writable.  This may break concurrent accesses to
devices behind the bridge.

Add a new pci_read_bridge_windows() to determine whether a bridge supports
the optional windows, call it once during enumeration, remember the
results, and change pci_bridge_check_ranges() so it doesn't touch the
bridge windows but sets the flag bits based on those remembered results.

Link: https://lore.kernel.org/linux-pci/1506151482-113560-1-git-send-email-wangzhou1@hisilicon.com
Link: https://lists.gnu.org/archive/html/qemu-devel/2018-12/msg02082.html
Reported-by: Yandong Xu <xuyandong2@huawei.com>
Tested-by: Yandong Xu <xuyandong2@huawei.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Sagi Grimberg <sagi@grimberg.me>
Cc: Ofer Hayut <ofer@lightbitslabs.com>
Cc: Roy Shterman <roys@lightbitslabs.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Zhou Wang <wangzhou1@hisilicon.com>
drivers/pci/probe.c
drivers/pci/setup-bus.c
include/linux/pci.h