Skip to content

Commit

Permalink
Merge branch 'pci/virtualization'
Browse files Browse the repository at this point in the history
  - 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
  • Loading branch information
Bjorn Helgaas committed Oct 20, 2018
2 parents 1734715 + 4c24371 commit eff81b6
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
3 changes: 2 additions & 1 deletion drivers/pci/iov.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
17 changes: 17 additions & 0 deletions drivers/pci/probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit eff81b6

Please sign in to comment.