]> git.baikalelectronics.ru Git - kernel.git/commit
PCI/IOV: Reset total_VFs limit after detaching PF driver
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 29 Jun 2018 20:08:52 +0000 (15:08 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 29 Jun 2018 20:08:52 +0000 (15:08 -0500)
commit47f2323e3439ddc5c9118964022103fd6b2a18e6
tree16da6a4edc6b5f3de22c73f7eec6789298317870
parent26c7691c11ac5bf1af445b80b3b8521b9a2a1671
PCI/IOV: Reset total_VFs limit after detaching PF driver

The TotalVFs register in the SR-IOV capability is the hardware limit on the
number of VFs.  A PF driver can limit the number of VFs further with
pci_sriov_set_totalvfs().  When the PF driver is removed, reset any VF
limit that was imposed by the driver because that limit may not apply to
other drivers.

Before b5b31eb7841b ("PCI/IOV: Allow PF drivers to limit total_VFs to 0"),
pci_sriov_set_totalvfs(pdev, 0) meant "we can enable TotalVFs virtual
functions", and the nfp driver used that to remove the VF limit when the
driver unloads.

b5b31eb7841b broke that because instead of removing the VF limit,
pci_sriov_set_totalvfs(pdev, 0) actually sets the limit to zero, and that
limit persists even if another driver is loaded.

We could fix that by making the nfp driver reset the limit when it unloads,
but it seems more robust to do it in the PCI core instead of relying on the
driver.

The regression scenario is:

  nfp_pci_probe (driver 1)
  ...
  nfp_pci_remove
    pci_sriov_set_totalvfs(pf->pdev, 0)   # limits VFs to 0

  ...
  nfp_pci_probe (driver 2)
    nfp_rtsym_read_le("nfd_vf_cfg_max_vfs")
    # no VF limit from firmware

Now driver 2 is broken because the VF limit is still 0 from driver 1.

Fixes: b5b31eb7841b ("PCI/IOV: Allow PF drivers to limit total_VFs to 0")
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
[bhelgaas: changelog, rename functions]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/iov.c
drivers/pci/pci-driver.c
drivers/pci/pci.h