diff mbox

v4.11 mlx5 regression

Message ID 1488578667.25946.1.camel@sandisk.com (mailing list archive)
State Superseded
Headers show

Commit Message

Bart Van Assche March 3, 2017, 10:04 p.m. UTC
On Tue, 2017-02-28 at 20:34 +0000, Parav Pandit wrote:
> In middle of debugging/using setup right now for other issue.
> I am basically using nvme-rdma target mode code and somewhere in path of MR or QP setup it fails.
> I am suspecting MR because QP1 creation has passed.
> I will get to the bottom of this to provide traces tomorrow.

Hello Parav,

The I/O MMU was disabled while I prepared and tested the patch series that
reworks DMA support for RDMA drivers. I assume that the error message you
reported means that the I/O MMU was enabled on your test setup? If so, can
you check whether the patch below makes the mlx5 driver (and all other RDMA
drivers) work again on your test setup?

Thanks,

Bart.


To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Parav Pandit March 4, 2017, 2:45 a.m. UTC | #1
Hi Bart,

> -----Original Message-----
> From: linux-rdma-owner@vger.kernel.org [mailto:linux-rdma-
> owner@vger.kernel.org] On Behalf Of Bart Van Assche
> Sent: Friday, March 3, 2017 4:05 PM
> To: Parav Pandit <parav@mellanox.com>; loberman@redhat.com
> Cc: linux-rdma@vger.kernel.org; dledford@redhat.com
> Subject: Re: v4.11 mlx5 regression
> 
> On Tue, 2017-02-28 at 20:34 +0000, Parav Pandit wrote:
> > In middle of debugging/using setup right now for other issue.
> > I am basically using nvme-rdma target mode code and somewhere in path
> of MR or QP setup it fails.
> > I am suspecting MR because QP1 creation has passed.
> > I will get to the bottom of this to provide traces tomorrow.
> 
Sorry. I didn't any chance last whole week to debug it.

> Hello Parav,
> 
> The I/O MMU was disabled while I prepared and tested the patch series that
> reworks DMA support for RDMA drivers. I assume that the error message
> you reported means that the I/O MMU was enabled on your test setup? 

Yes. Iommu is enabled.

>If so, can you check whether the patch below makes the mlx5 driver (and all
> other RDMA
> drivers) work again on your test setup?
> 
I tested this patch. It works with mlx5 driver.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bart Van Assche March 4, 2017, 3:42 a.m. UTC | #2
T24gU2F0LCAyMDE3LTAzLTA0IGF0IDAyOjQ1ICswMDAwLCBQYXJhdiBQYW5kaXQgd3JvdGU6DQo+
ID4gRnJvbTogbGludXgtcmRtYS1vd25lckB2Z2VyLmtlcm5lbC5vcmcgW21haWx0bzpsaW51eC1y
ZG1hLQ0KPiA+IG93bmVyQHZnZXIua2VybmVsLm9yZ10gT24gQmVoYWxmIE9mIEJhcnQgVmFuIEFz
c2NoZQ0KPiA+IA0KPiA+IElmIHNvLCBjYW4geW91IGNoZWNrIHdoZXRoZXIgdGhlIHBhdGNoIGJl
bG93IG1ha2VzIHRoZSBtbHg1IGRyaXZlciAoYW5kIGFsbA0KPiA+IG90aGVyIFJETUENCj4gPiBk
cml2ZXJzKSB3b3JrIGFnYWluIG9uIHlvdXIgdGVzdCBzZXR1cD8NCj4gDQo+IEkgdGVzdGVkIHRo
aXMgcGF0Y2guIEl0IHdvcmtzIHdpdGggbWx4NSBkcml2ZXIuDQoNClRoYW5rcyBmb3IgdGhlIHRl
c3RpbmchDQoNCkJhcnQu
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 593d2ce6ec7c..d80e3f3b9bae 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -39,6 +39,7 @@ 
 #include <linux/init.h>
 #include <linux/mutex.h>
 #include <linux/netdevice.h>
+#include <linux/pci.h>
 #include <rdma/rdma_netlink.h>
 #include <rdma/ib_addr.h>
 #include <rdma/ib_cache.h>
@@ -336,8 +337,12 @@  int ib_register_device(struct ib_device *device,
 	struct device *parent = device->dev.parent;
 
 	WARN_ON_ONCE(!parent);
-	if (!device->dev.dma_ops)
+	if (!device->dev.dma_ops) {
 		device->dev.dma_ops = parent->dma_ops;
+		device->dev.pci_dev = to_pci_dev(parent);
+		/* For I/O MMU support */
+		device->dev.archdata = parent->archdata;
+	}
 	if (!device->dev.dma_mask)
 		device->dev.dma_mask = parent->dma_mask;
 	if (!device->dev.coherent_dma_mask)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index dfc9a2794141..60d739b59520 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1736,6 +1736,7 @@  struct pci_dev *pci_alloc_dev(struct pci_bus *bus)
 
 	INIT_LIST_HEAD(&dev->bus_list);
 	dev->dev.type = &pci_dev_type;
+	dev->dev.pci_dev = dev;
 	dev->bus = pci_bus_get(bus);
 
 	return dev;
diff --git a/include/linux/device.h b/include/linux/device.h
index 30c4570e928d..c18afd376d2a 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -42,6 +42,7 @@  struct fwnode_handle;
 struct iommu_ops;
 struct iommu_group;
 struct iommu_fwspec;
+struct pci_dev;
 
 struct bus_attribute {
 	struct attribute	attr;
@@ -860,6 +861,9 @@  struct dev_links_info {
  * 		segment limitations.
  * @dma_pools:	Dma pools (if dma'ble device).
  * @dma_mem:	Internal for coherent mem override.
+ * @pci_dev:	PCI device associated with this device. Used by DMA mapping
+ *		operations on architectures that need access to PCI device
+ *		members that are not in struct device.
  * @cma_area:	Contiguous memory area for dma allocations
  * @archdata:	For arch-specific additions.
  * @of_node:	Associated device tree node.
@@ -940,6 +944,7 @@  struct device {
 
 	struct dma_coherent_mem	*dma_mem; /* internal for coherent mem
 					     override */
+	struct pci_dev		*pci_dev; /* for DMA mapping operations */
 #ifdef CONFIG_DMA_CMA
 	struct cma *cma_area;		/* contiguous memory area for dma
 					   allocations */
diff --git a/include/linux/pci.h b/include/linux/pci.h
index eb3da1a04e6c..eca790eaae20 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -409,7 +409,10 @@  static inline struct pci_dev *pci_physfn(struct pci_dev *dev)
 
 struct pci_dev *pci_alloc_dev(struct pci_bus *bus);
 
-#define	to_pci_dev(n) container_of(n, struct pci_dev, dev)
+static inline struct pci_dev *to_pci_dev(const struct device *dev)
+{
+	return dev->pci_dev;
+}
 #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)
 
 static inline int pci_channel_offline(struct pci_dev *pdev)--