From: Kuppuswamy Sathyanarayanan <[email protected]>

Currently all VF's needs to be disable their ATS service before
disabling the ATS service in corresponding PF device. But this logic is
incorrect and does not align with the spec. Also it might lead to
some power and performance impact in the system. As per PCIe spec r4.0,
sec 9.3.7.8, ATS Capabilities in VFs and their associated PFs may be
enabled/disabled independently. So remove this dependency logic in
enable/disable code.

Cc: Ashok Raj <[email protected]>
Cc: Keith Busch <[email protected]>
Suggested-by: Ashok Raj <[email protected]>
Signed-off-by: Kuppuswamy Sathyanarayanan 
<[email protected]>
---
 drivers/pci/ats.c   | 11 -----------
 include/linux/pci.h |  1 -
 2 files changed, 12 deletions(-)

diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c
index 13fe88829306..8ee2c1123b84 100644
--- a/drivers/pci/ats.c
+++ b/drivers/pci/ats.c
@@ -140,8 +140,6 @@ int pci_enable_ats(struct pci_dev *dev, int ps)
                pdev = pci_physfn(dev);
                if (pdev->ats_stu != ps)
                        return -EINVAL;
-
-               atomic_inc(&pdev->ats_ref_cnt);  /* count enabled VFs */
        } else {
                dev->ats_stu = ps;
                ctrl |= PCI_ATS_CTRL_STU(dev->ats_stu - PCI_ATS_MIN_STU);
@@ -159,20 +157,11 @@ EXPORT_SYMBOL_GPL(pci_enable_ats);
  */
 void pci_disable_ats(struct pci_dev *dev)
 {
-       struct pci_dev *pdev;
        u16 ctrl;
 
        if (WARN_ON(!dev->ats_enabled))
                return;
 
-       if (atomic_read(&dev->ats_ref_cnt))
-               return;         /* VFs still enabled */
-
-       if (dev->is_virtfn) {
-               pdev = pci_physfn(dev);
-               atomic_dec(&pdev->ats_ref_cnt);
-       }
-
        pci_read_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, &ctrl);
        ctrl &= ~PCI_ATS_CTRL_ENABLE;
        pci_write_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, ctrl);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index a317c3115d69..442ced0d2dd1 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -449,7 +449,6 @@ struct pci_dev {
        };
        u16             ats_cap;        /* ATS Capability offset */
        u8              ats_stu;        /* ATS Smallest Translation Unit */
-       atomic_t        ats_ref_cnt;    /* Number of VFs with ATS enabled */
 #endif
 #ifdef CONFIG_PCI_PRI
        struct mutex    pri_lock;       /* PRI enable lock */
-- 
2.21.0

Reply via email to