Merge branch 'pci/virtualization'
authorBjorn Helgaas <bhelgaas@google.com>
Sat, 20 Oct 2018 16:45:35 +0000 (11:45 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Sat, 20 Oct 2018 16:45:35 +0000 (11:45 -0500)
  - Cache VF config space size to optimize enumeration of many VFs
    (KarimAllah Ahmed)

  - Remove unnecessary <linux/pci-ats.h> include (Bjorn Helgaas)

* pci/virtualization:
  PCI/IOV: Remove unnecessary include of <linux/pci-ats.h>
  PCI/IOV: Use VF0 cached config space size for other VFs

drivers/pci/iov.c
drivers/pci/pci.h
drivers/pci/probe.c

index c5f3cd4ed766f8d79798e8e22a8e12f56764333f..9616eca3182f95f764b2314be28e71f5c395a2db 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/export.h>
 #include <linux/string.h>
 #include <linux/delay.h>
-#include <linux/pci-ats.h>
 #include "pci.h"
 
 #define VIRTFN_ID_LEN  16
@@ -133,6 +132,8 @@ static void pci_read_vf_config_common(struct pci_dev *virtfn)
                             &physfn->sriov->subsystem_vendor);
        pci_read_config_word(virtfn, PCI_SUBSYSTEM_ID,
                             &physfn->sriov->subsystem_device);
+
+       physfn->sriov->cfg_size = pci_cfg_space_size(virtfn);
 }
 
 int pci_iov_add_virtfn(struct pci_dev *dev, int id)
index 672ba4d1659effd3a22900ae32283e15376212be..662b7457db2374d9c7fd039d2e40a54cfda5dc5b 100644 (file)
@@ -290,6 +290,7 @@ struct pci_sriov {
        u16             driver_max_VFs; /* Max num VFs driver supports */
        struct pci_dev  *dev;           /* Lowest numbered PF */
        struct pci_dev  *self;          /* This PF */
+       u32             cfg_size;       /* VF config space size */
        u32             class;          /* VF device */
        u8              hdr_type;       /* VF header type */
        u16             subsystem_vendor; /* VF subsystem vendor */
index 966641d517ba701a82aa9d316f6a0f499bfcebc2..b1c05b5054a0c5a72385ef122410237f6a02e8ea 100644 (file)
@@ -1439,12 +1439,29 @@ 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;
        u32 status;
        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;
+#endif
+
        if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG)
                return PCI_CFG_SPACE_SIZE;