* [PATCH] mlx5: Fix missing device local_dma_lkey
@ 2015-07-20 16:54 Sagi Grimberg
[not found] ` <1437411276-22731-1-git-send-email-sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
0 siblings, 1 reply; 5+ messages in thread
From: Sagi Grimberg @ 2015-07-20 16:54 UTC (permalink / raw)
To: linux-rdma-u79uwXL29TY76Z2rM5mHXA; +Cc: Or Gerlitz, Eli Cohen
The mlx5 driver exposes device capability IB_DEVICE_LOCAL_DMA_LKEY
but does not set the the device local_dma_lkey. This breaks
rpcrdma drivers.
Query and set this lkey when creating the device resources.
Signed-off-by: Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
drivers/infiniband/hw/mlx5/main.c | 9 ++++++++-
drivers/net/ethernet/mellanox/mlx5/core/fw.c | 22 ++++++++++++++++++++++
include/linux/mlx5/device.h | 11 +++++++++++
include/linux/mlx5/driver.h | 1 +
4 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 11bd9ec..b272c8a 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -1257,10 +1257,18 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
struct ib_srq_init_attr attr;
struct mlx5_ib_dev *dev;
struct ib_cq_init_attr cq_attr = {.cqe = 1};
+ u32 rsvd_lkey;
int ret = 0;
dev = container_of(devr, struct mlx5_ib_dev, devr);
+ ret = mlx5_core_query_special_context(dev->mdev, &rsvd_lkey);
+ if (ret) {
+ pr_err("Failed to query special context %d\n", ret);
+ return ret;
+ }
+ dev->ib_dev.local_dma_lkey = rsvd_lkey;
+
devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL);
if (IS_ERR(devr->p0)) {
ret = PTR_ERR(devr->p0);
@@ -1422,7 +1430,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX);
dev->ib_dev.owner = THIS_MODULE;
dev->ib_dev.node_type = RDMA_NODE_IB_CA;
- dev->ib_dev.local_dma_lkey = 0 /* not supported for now */;
dev->num_ports = MLX5_CAP_GEN(mdev, num_ports);
dev->ib_dev.phys_port_cnt = dev->num_ports;
dev->ib_dev.num_comp_vectors =
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c
index 9335e5a..aa0d5ff 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c
@@ -200,3 +200,25 @@ int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev)
return err;
}
+
+int mlx5_core_query_special_context(struct mlx5_core_dev *dev, u32 *rsvd_lkey)
+{
+ struct mlx5_cmd_query_special_contexts_mbox_in in;
+ struct mlx5_cmd_query_special_contexts_mbox_out out;
+ int err;
+
+ memset(&in, 0, sizeof(in));
+ memset(&out, 0, sizeof(out));
+ in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS);
+ err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
+ if (err)
+ return err;
+
+ if (out.hdr.status)
+ err = mlx5_cmd_status_to_err(&out.hdr);
+
+ *rsvd_lkey = be32_to_cpu(out.resd_lkey);
+
+ return err;
+}
+EXPORT_SYMBOL(mlx5_core_query_special_context);
diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h
index b943cd9..6e4169c 100644
--- a/include/linux/mlx5/device.h
+++ b/include/linux/mlx5/device.h
@@ -402,6 +402,17 @@ struct mlx5_cmd_teardown_hca_mbox_out {
u8 rsvd[8];
};
+struct mlx5_cmd_query_special_contexts_mbox_in {
+ struct mlx5_inbox_hdr hdr;
+ u8 rsvd[8];
+};
+
+struct mlx5_cmd_query_special_contexts_mbox_out {
+ struct mlx5_outbox_hdr hdr;
+ __be32 dump_fill_mkey;
+ __be32 resd_lkey;
+};
+
struct mlx5_cmd_layout {
u8 type;
u8 rsvd0[3];
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
index 5722d88..1e2e48c 100644
--- a/include/linux/mlx5/driver.h
+++ b/include/linux/mlx5/driver.h
@@ -828,6 +828,7 @@ void *mlx5_get_protocol_dev(struct mlx5_core_dev *mdev, int protocol);
int mlx5_register_interface(struct mlx5_interface *intf);
void mlx5_unregister_interface(struct mlx5_interface *intf);
int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id);
+int mlx5_core_query_special_context(struct mlx5_core_dev *dev, u32 *rsvd_lkey);
struct mlx5_profile {
u64 mask;
--
1.8.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 5+ messages in thread[parent not found: <1437411276-22731-1-git-send-email-sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>]
* Re: [PATCH] mlx5: Fix missing device local_dma_lkey [not found] ` <1437411276-22731-1-git-send-email-sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> @ 2015-07-20 17:08 ` Chuck Lever [not found] ` <3095C235-676F-4A99-A27C-F2F332D9921F-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> 2015-07-28 15:09 ` Doug Ledford 1 sibling, 1 reply; 5+ messages in thread From: Chuck Lever @ 2015-07-20 17:08 UTC (permalink / raw) To: Sagi Grimberg; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA, Or Gerlitz, Eli Cohen On Jul 20, 2015, at 12:54 PM, Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> wrote: > The mlx5 driver exposes device capability IB_DEVICE_LOCAL_DMA_LKEY > but does not set the the device local_dma_lkey. This breaks > rpcrdma drivers. > > Query and set this lkey when creating the device resources. Wow. This suggests no-one has been testing NFS/RDMA with mlx5? I know I’m not (yet). Anyway, this makes sense. > Signed-off-by: Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> > --- > drivers/infiniband/hw/mlx5/main.c | 9 ++++++++- > drivers/net/ethernet/mellanox/mlx5/core/fw.c | 22 ++++++++++++++++++++++ > include/linux/mlx5/device.h | 11 +++++++++++ > include/linux/mlx5/driver.h | 1 + > 4 files changed, 42 insertions(+), 1 deletion(-) > > diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c > index 11bd9ec..b272c8a 100644 > --- a/drivers/infiniband/hw/mlx5/main.c > +++ b/drivers/infiniband/hw/mlx5/main.c > @@ -1257,10 +1257,18 @@ static int create_dev_resources(struct mlx5_ib_resources *devr) > struct ib_srq_init_attr attr; > struct mlx5_ib_dev *dev; > struct ib_cq_init_attr cq_attr = {.cqe = 1}; > + u32 rsvd_lkey; > int ret = 0; > > dev = container_of(devr, struct mlx5_ib_dev, devr); > > + ret = mlx5_core_query_special_context(dev->mdev, &rsvd_lkey); > + if (ret) { > + pr_err("Failed to query special context %d\n", ret); > + return ret; > + } > + dev->ib_dev.local_dma_lkey = rsvd_lkey; > + > devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL); > if (IS_ERR(devr->p0)) { > ret = PTR_ERR(devr->p0); > @@ -1422,7 +1430,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) > strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX); > dev->ib_dev.owner = THIS_MODULE; > dev->ib_dev.node_type = RDMA_NODE_IB_CA; > - dev->ib_dev.local_dma_lkey = 0 /* not supported for now */; > dev->num_ports = MLX5_CAP_GEN(mdev, num_ports); > dev->ib_dev.phys_port_cnt = dev->num_ports; > dev->ib_dev.num_comp_vectors = > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c > index 9335e5a..aa0d5ff 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c > @@ -200,3 +200,25 @@ int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev) > > return err; > } > + > +int mlx5_core_query_special_context(struct mlx5_core_dev *dev, u32 *rsvd_lkey) > +{ > + struct mlx5_cmd_query_special_contexts_mbox_in in; > + struct mlx5_cmd_query_special_contexts_mbox_out out; > + int err; > + > + memset(&in, 0, sizeof(in)); > + memset(&out, 0, sizeof(out)); > + in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS); > + err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); > + if (err) > + return err; > + > + if (out.hdr.status) > + err = mlx5_cmd_status_to_err(&out.hdr); > + > + *rsvd_lkey = be32_to_cpu(out.resd_lkey); > + > + return err; > +} > +EXPORT_SYMBOL(mlx5_core_query_special_context); > diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h > index b943cd9..6e4169c 100644 > --- a/include/linux/mlx5/device.h > +++ b/include/linux/mlx5/device.h > @@ -402,6 +402,17 @@ struct mlx5_cmd_teardown_hca_mbox_out { > u8 rsvd[8]; > }; > > +struct mlx5_cmd_query_special_contexts_mbox_in { > + struct mlx5_inbox_hdr hdr; > + u8 rsvd[8]; > +}; > + > +struct mlx5_cmd_query_special_contexts_mbox_out { > + struct mlx5_outbox_hdr hdr; > + __be32 dump_fill_mkey; > + __be32 resd_lkey; > +}; > + > struct mlx5_cmd_layout { > u8 type; > u8 rsvd0[3]; > diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h > index 5722d88..1e2e48c 100644 > --- a/include/linux/mlx5/driver.h > +++ b/include/linux/mlx5/driver.h > @@ -828,6 +828,7 @@ void *mlx5_get_protocol_dev(struct mlx5_core_dev *mdev, int protocol); > int mlx5_register_interface(struct mlx5_interface *intf); > void mlx5_unregister_interface(struct mlx5_interface *intf); > int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id); > +int mlx5_core_query_special_context(struct mlx5_core_dev *dev, u32 *rsvd_lkey); > > struct mlx5_profile { > u64 mask; -- Chuck Lever -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <3095C235-676F-4A99-A27C-F2F332D9921F-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH] mlx5: Fix missing device local_dma_lkey [not found] ` <3095C235-676F-4A99-A27C-F2F332D9921F-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> @ 2015-07-20 17:09 ` Sagi Grimberg [not found] ` <55AD2B65.4090006-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 0 siblings, 1 reply; 5+ messages in thread From: Sagi Grimberg @ 2015-07-20 17:09 UTC (permalink / raw) To: Chuck Lever; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA, Or Gerlitz, Eli Cohen On 7/20/2015 8:08 PM, Chuck Lever wrote: > > On Jul 20, 2015, at 12:54 PM, Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> wrote: > >> The mlx5 driver exposes device capability IB_DEVICE_LOCAL_DMA_LKEY >> but does not set the the device local_dma_lkey. This breaks >> rpcrdma drivers. >> >> Query and set this lkey when creating the device resources. > > Wow. This suggests no-one has been testing NFS/RDMA with mlx5? I > know I’m not (yet). Anyway, this makes sense. That's what I was wandering about. I just turned it on and it blew up... gracefully though :) -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <55AD2B65.4090006-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>]
* Re: [PATCH] mlx5: Fix missing device local_dma_lkey [not found] ` <55AD2B65.4090006-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> @ 2015-07-20 19:52 ` Jason Gunthorpe 0 siblings, 0 replies; 5+ messages in thread From: Jason Gunthorpe @ 2015-07-20 19:52 UTC (permalink / raw) To: Sagi Grimberg Cc: Chuck Lever, linux-rdma-u79uwXL29TY76Z2rM5mHXA, Or Gerlitz, Eli Cohen On Mon, Jul 20, 2015 at 08:09:57PM +0300, Sagi Grimberg wrote: > On 7/20/2015 8:08 PM, Chuck Lever wrote: > > > >On Jul 20, 2015, at 12:54 PM, Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> wrote: > > > >>The mlx5 driver exposes device capability IB_DEVICE_LOCAL_DMA_LKEY > >>but does not set the the device local_dma_lkey. This breaks > >>rpcrdma drivers. > >> > >>Query and set this lkey when creating the device resources. > > > >Wow. This suggests no-one has been testing NFS/RDMA with mlx5? I > >know I’m not (yet). Anyway, this makes sense. > > That's what I was wandering about. > > I just turned it on and it blew up... gracefully though :) Ugh, good thing you caught this before I sent my cleanup: https://github.com/jgunthorpe/linux/tree/remove-ib_get_dma_mr Jason -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] mlx5: Fix missing device local_dma_lkey [not found] ` <1437411276-22731-1-git-send-email-sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> 2015-07-20 17:08 ` Chuck Lever @ 2015-07-28 15:09 ` Doug Ledford 1 sibling, 0 replies; 5+ messages in thread From: Doug Ledford @ 2015-07-28 15:09 UTC (permalink / raw) To: Sagi Grimberg, linux-rdma-u79uwXL29TY76Z2rM5mHXA; +Cc: Or Gerlitz, Eli Cohen [-- Attachment #1: Type: text/plain, Size: 503 bytes --] On 07/20/2015 12:54 PM, Sagi Grimberg wrote: > The mlx5 driver exposes device capability IB_DEVICE_LOCAL_DMA_LKEY > but does not set the the device local_dma_lkey. This breaks > rpcrdma drivers. > > Query and set this lkey when creating the device resources. > > Signed-off-by: Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> Thanks, I've picked this up for 4.3. -- Doug Ledford <dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> GPG KeyID: 0E572FDD [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 884 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-07-28 15:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-20 16:54 [PATCH] mlx5: Fix missing device local_dma_lkey Sagi Grimberg
[not found] ` <1437411276-22731-1-git-send-email-sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-07-20 17:08 ` Chuck Lever
[not found] ` <3095C235-676F-4A99-A27C-F2F332D9921F-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2015-07-20 17:09 ` Sagi Grimberg
[not found] ` <55AD2B65.4090006-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-07-20 19:52 ` Jason Gunthorpe
2015-07-28 15:09 ` Doug Ledford
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox