]> www.infradead.org Git - users/jedix/linux-maple.git/commit
PCI: Allocate ATS struct during enumeration
authorBjorn Helgaas <bhelgaas@google.com>
Tue, 7 Aug 2018 00:51:33 +0000 (20:51 -0400)
committerBrian Maly <brian.maly@oracle.com>
Tue, 21 Aug 2018 17:34:49 +0000 (13:34 -0400)
commit45f4db8ab75cea5ea0a98e29651c5f948077d815
treecfe4f985cab3f2e8e489122430b0082373f3c8df
parent57ab56e6ccf25b1f3e81d446bdce798484868476
PCI: Allocate ATS struct during enumeration

Previously, we allocated pci_ats structures when an IOMMU driver called
pci_enable_ats().  An SR-IOV VF shares the STU setting with its PF, so when
enabling ATS on the VF, we allocated a pci_ats struct for the PF if it
didn't already have one.  We held the sriov->lock to serialize threads
concurrently enabling ATS on several VFS so only one would allocate the PF
pci_ats.

Gregor reported a deadlock here:

  pci_enable_sriov
    sriov_enable
      virtfn_add
        mutex_lock(dev->sriov->lock)      # acquire sriov->lock
        pci_device_add
          device_add
            BUS_NOTIFY_ADD_DEVICE notifier chain
            iommu_bus_notifier
              amd_iommu_add_device        # iommu_ops.add_device
                init_iommu_group
                  iommu_group_get_for_dev
                    iommu_group_add_device
                      __iommu_attach_device
                        amd_iommu_attach_device  # iommu_ops.attach_device
                          attach_device
                            pci_enable_ats
                              mutex_lock(dev->sriov->lock) # deadlock

There's no reason to delay allocating the pci_ats struct, and if we
allocate it for each device at enumeration-time, there's no need for
locking in pci_enable_ats().

Allocate pci_ats struct during enumeration, when we initialize other
capabilities.

Note that this implementation requires ATS to be enabled on the PF first,
before on any of the VFs because the PF controls the STU for all the VFs.

Link: http://permalink.gmane.org/gmane.linux.kernel.iommu/9433
Reported-by: Gregor Dick <gdick@solarflare.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
(cherry pick from commit edc90fee916b4f0d14af9c6b5c08666747488ef8)

Orabug: 28460092

Signed-off-by: Kanth Ghatraju <kanth.ghatraju@oracle.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/pci/ats.c
drivers/pci/probe.c
drivers/pci/remove.c
include/linux/pci-ats.h
include/linux/pci.h