Message ID | 20190619185626.15806-1-logang@deltatee.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | [v2] PCI/P2PDMA: Root complex whitelist should not apply when an IOMMU is present | expand |
On Wed, Jun 19, 2019 at 12:56:26PM -0600, Logan Gunthorpe wrote: > Presently, there is no path to DMA map P2PDMA memory, so if a TLP > targeting this memory hits the root complex and an IOMMU is present, > the IOMMU will reject the transaction, even if the RC would support > P2PDMA. > > So until the kernel knows to map these DMA addresses in the IOMMU, > we should not enable the whitelist when an IOMMU is present. > > Link: https://lore.kernel.org/linux-pci/20190522201252.2997-1-logang@deltatee.com/ > Fixes: 0f97da831026 ("PCI/P2PDMA: Allow P2P DMA between any devices under AMD ZEN Root Complex") > Signed-off-by: Logan Gunthorpe <logang@deltatee.com> > Reviewed-by: Christian König <christian.koenig@amd.com> > Cc: Bjorn Helgaas <bhelgaas@google.com> > Cc: Christoph Hellwig <hch@lst.de> Applied to for-linus for v5.2, since we merged 0f97da831026 during the v5.2 merge window, thanks! > --- > drivers/pci/p2pdma.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c > index a98126ad9c3a..a4994aa3acc0 100644 > --- a/drivers/pci/p2pdma.c > +++ b/drivers/pci/p2pdma.c > @@ -18,6 +18,7 @@ > #include <linux/percpu-refcount.h> > #include <linux/random.h> > #include <linux/seq_buf.h> > +#include <linux/iommu.h> > > struct pci_p2pdma { > struct gen_pool *pool; > @@ -299,6 +300,9 @@ static bool root_complex_whitelist(struct pci_dev *dev) > struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0)); > unsigned short vendor, device; > > + if (iommu_present(dev->dev.bus)) > + return false; > + > if (!root) > return false; > > -- > 2.20.1 >
diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index a98126ad9c3a..a4994aa3acc0 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -18,6 +18,7 @@ #include <linux/percpu-refcount.h> #include <linux/random.h> #include <linux/seq_buf.h> +#include <linux/iommu.h> struct pci_p2pdma { struct gen_pool *pool; @@ -299,6 +300,9 @@ static bool root_complex_whitelist(struct pci_dev *dev) struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0)); unsigned short vendor, device; + if (iommu_present(dev->dev.bus)) + return false; + if (!root) return false;