diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2019-07-12 17:08:29 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2019-07-12 17:08:29 -0500 |
commit | 55ab3ecb81d5c071287a17567f7573f16934a9e9 (patch) | |
tree | aac0a34ad9546b82137e533eca94e24cb76f299d /drivers/pci/probe.c | |
parent | 8c6af6f04252110b3e4c2ff1614a4518d5208383 (diff) | |
parent | 06013b647c708e4f3179b7b0cf3adf28cb8cbfcf (diff) |
Merge branch 'pci/virtualization'
- Fix problem with caching VF config space size (Alex Williamson)
* pci/virtualization:
PCI/IOV: Assume SR-IOV VFs support extended config space.
Revert "PCI/IOV: Use VF0 cached config space size for other VFs"
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r-- | drivers/pci/probe.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index c5f27c8cd140..5a0b07428425 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1555,17 +1555,6 @@ static int pci_cfg_space_size_ext(struct pci_dev *dev) return PCI_CFG_SPACE_EXP_SIZE; } -#ifdef CONFIG_PCI_IOV -static bool is_vf0(struct pci_dev *dev) -{ - if (pci_iov_virtfn_devfn(dev->physfn, 0) == dev->devfn && - pci_iov_virtfn_bus(dev->physfn, 0) == dev->bus->number) - return true; - - return false; -} -#endif - int pci_cfg_space_size(struct pci_dev *dev) { int pos; @@ -1573,9 +1562,18 @@ int pci_cfg_space_size(struct pci_dev *dev) u16 class; #ifdef CONFIG_PCI_IOV - /* Read cached value for all VFs except for VF0 */ - if (dev->is_virtfn && !is_vf0(dev)) - return dev->physfn->sriov->cfg_size; + /* + * Per the SR-IOV specification (rev 1.1, sec 3.5), VFs are required to + * implement a PCIe capability and therefore must implement extended + * config space. We can skip the NO_EXTCFG test below and the + * reachability/aliasing test in pci_cfg_space_size_ext() by virtue of + * the fact that the SR-IOV capability on the PF resides in extended + * config space and must be accessible and non-aliased to have enabled + * support for this VF. This is a micro performance optimization for + * systems supporting many VFs. + */ + if (dev->is_virtfn) + return PCI_CFG_SPACE_EXP_SIZE; #endif if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG) |