linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs
@ 2024-05-07  9:53 Konstantin Taranov
  2024-05-07  9:53 ` [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP Konstantin Taranov
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-07  9:53 UTC (permalink / raw)
  To: kotaranov, sharmaajay, longli, jgg, leon; +Cc: linux-rdma, linux-kernel

From: Konstantin Taranov <kotaranov@microsoft.com>

This patch series enables creation and destruction of RC QPs.
The RC QP can be transitioned to RTS and be used by rdma-core.

Later I will submit rdma-core patches with fully working RC QPs.

Konstantin Taranov (3):
  RDMA/mana_ib: Create and destroy RC QP
  RDMA/mana_ib: Implement uapi to create and destroy RC QP
  RDMA/mana_ib: Modify QP state

 drivers/infiniband/hw/mana/main.c    |  59 ++++++++++
 drivers/infiniband/hw/mana/mana_ib.h |  99 +++++++++++++++-
 drivers/infiniband/hw/mana/qp.c      | 165 ++++++++++++++++++++++++++-
 include/uapi/rdma/mana-abi.h         |   9 ++
 4 files changed, 328 insertions(+), 4 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP
  2024-05-07  9:53 [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Konstantin Taranov
@ 2024-05-07  9:53 ` Konstantin Taranov
  2024-05-20 19:40   ` Long Li
  2024-05-07  9:53 ` [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create " Konstantin Taranov
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-07  9:53 UTC (permalink / raw)
  To: kotaranov, sharmaajay, longli, jgg, leon; +Cc: linux-rdma, linux-kernel

From: Konstantin Taranov <kotaranov@microsoft.com>

Implement HW requests to create and destroy an RC QP.
An RC QP may have 5 queues.

Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
---
 drivers/infiniband/hw/mana/main.c    | 59 ++++++++++++++++++++++++++++
 drivers/infiniband/hw/mana/mana_ib.h | 58 ++++++++++++++++++++++++++-
 2 files changed, 116 insertions(+), 1 deletion(-)

diff --git a/drivers/infiniband/hw/mana/main.c b/drivers/infiniband/hw/mana/main.c
index 2a41135..6bd6072 100644
--- a/drivers/infiniband/hw/mana/main.c
+++ b/drivers/infiniband/hw/mana/main.c
@@ -888,3 +888,62 @@ int mana_ib_gd_destroy_cq(struct mana_ib_dev *mdev, struct mana_ib_cq *cq)
 
 	return 0;
 }
+
+int mana_ib_gd_create_rc_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp,
+			    struct ib_qp_init_attr *attr, u32 doorbell, u64 flags)
+{
+	struct mana_ib_cq *send_cq = container_of(qp->ibqp.send_cq, struct mana_ib_cq, ibcq);
+	struct mana_ib_cq *recv_cq = container_of(qp->ibqp.recv_cq, struct mana_ib_cq, ibcq);
+	struct mana_ib_pd *pd = container_of(qp->ibqp.pd, struct mana_ib_pd, ibpd);
+	struct gdma_context *gc = mdev_to_gc(mdev);
+	struct mana_rnic_create_qp_resp resp = {};
+	struct mana_rnic_create_qp_req req = {};
+	int err, i;
+
+	mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_RC_QP, sizeof(req), sizeof(resp));
+	req.hdr.dev_id = gc->mana_ib.dev_id;
+	req.adapter = mdev->adapter_handle;
+	req.pd_handle = pd->pd_handle;
+	req.send_cq_handle = send_cq->cq_handle;
+	req.recv_cq_handle = recv_cq->cq_handle;
+	for (i = 0; i < MANA_RC_QUEUE_TYPE_MAX; i++)
+		req.dma_region[i] = qp->rc_qp.queues[i].gdma_region;
+	req.doorbell_page = doorbell;
+	req.max_send_wr = attr->cap.max_send_wr;
+	req.max_recv_wr = attr->cap.max_recv_wr;
+	req.max_send_sge = attr->cap.max_send_sge;
+	req.max_recv_sge = attr->cap.max_recv_sge;
+	req.flags = flags;
+
+	err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
+	if (err) {
+		ibdev_err(&mdev->ib_dev, "Failed to create rc qp err %d", err);
+		return err;
+	}
+	qp->qp_handle = resp.rc_qp_handle;
+	for (i = 0; i < MANA_RC_QUEUE_TYPE_MAX; i++) {
+		qp->rc_qp.queues[i].id = resp.queue_ids[i];
+		/* The GDMA regions are now owned by the RNIC QP handle */
+		qp->rc_qp.queues[i].gdma_region = GDMA_INVALID_DMA_REGION;
+	}
+	return 0;
+}
+
+int mana_ib_gd_destroy_rc_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp)
+{
+	struct mana_rnic_destroy_rc_qp_resp resp = {0};
+	struct mana_rnic_destroy_rc_qp_req req = {0};
+	struct gdma_context *gc = mdev_to_gc(mdev);
+	int err;
+
+	mana_gd_init_req_hdr(&req.hdr, MANA_IB_DESTROY_RC_QP, sizeof(req), sizeof(resp));
+	req.hdr.dev_id = gc->mana_ib.dev_id;
+	req.adapter = mdev->adapter_handle;
+	req.rc_qp_handle = qp->qp_handle;
+	err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
+	if (err) {
+		ibdev_err(&mdev->ib_dev, "Failed to destroy rc qp err %d", err);
+		return err;
+	}
+	return 0;
+}
diff --git a/drivers/infiniband/hw/mana/mana_ib.h b/drivers/infiniband/hw/mana/mana_ib.h
index 68c3b4f..a3e229c 100644
--- a/drivers/infiniband/hw/mana/mana_ib.h
+++ b/drivers/infiniband/hw/mana/mana_ib.h
@@ -95,11 +95,27 @@ struct mana_ib_cq {
 	mana_handle_t  cq_handle;
 };
 
+enum mana_rc_queue_type {
+	MANA_RC_SEND_QUEUE_REQUESTER = 0,
+	MANA_RC_SEND_QUEUE_RESPONDER,
+	MANA_RC_SEND_QUEUE_FMR,
+	MANA_RC_RECV_QUEUE_REQUESTER,
+	MANA_RC_RECV_QUEUE_RESPONDER,
+	MANA_RC_QUEUE_TYPE_MAX,
+};
+
+struct mana_ib_rc_qp {
+	struct mana_ib_queue queues[MANA_RC_QUEUE_TYPE_MAX];
+};
+
 struct mana_ib_qp {
 	struct ib_qp ibqp;
 
 	mana_handle_t qp_handle;
-	struct mana_ib_queue raw_sq;
+	union {
+		struct mana_ib_queue raw_sq;
+		struct mana_ib_rc_qp rc_qp;
+	};
 
 	/* The port on the IB device, starting with 1 */
 	u32 port;
@@ -122,6 +138,8 @@ enum mana_ib_command_code {
 	MANA_IB_CONFIG_MAC_ADDR	= 0x30005,
 	MANA_IB_CREATE_CQ       = 0x30008,
 	MANA_IB_DESTROY_CQ      = 0x30009,
+	MANA_IB_CREATE_RC_QP    = 0x3000a,
+	MANA_IB_DESTROY_RC_QP   = 0x3000b,
 };
 
 struct mana_ib_query_adapter_caps_req {
@@ -230,6 +248,40 @@ struct mana_rnic_destroy_cq_resp {
 	struct gdma_resp_hdr hdr;
 }; /* HW Data */
 
+struct mana_rnic_create_qp_req {
+	struct gdma_req_hdr hdr;
+	mana_handle_t adapter;
+	mana_handle_t pd_handle;
+	mana_handle_t send_cq_handle;
+	mana_handle_t recv_cq_handle;
+	u64 dma_region[MANA_RC_QUEUE_TYPE_MAX];
+	u64 deprecated[2];
+	u64 flags;
+	u32 doorbell_page;
+	u32 max_send_wr;
+	u32 max_recv_wr;
+	u32 max_send_sge;
+	u32 max_recv_sge;
+	u32 reserved;
+}; /* HW Data */
+
+struct mana_rnic_create_qp_resp {
+	struct gdma_resp_hdr hdr;
+	mana_handle_t rc_qp_handle;
+	u32 queue_ids[MANA_RC_QUEUE_TYPE_MAX];
+	u32 reserved;
+}; /* HW Data*/
+
+struct mana_rnic_destroy_rc_qp_req {
+	struct gdma_req_hdr hdr;
+	mana_handle_t adapter;
+	mana_handle_t rc_qp_handle;
+}; /* HW Data */
+
+struct mana_rnic_destroy_rc_qp_resp {
+	struct gdma_resp_hdr hdr;
+}; /* HW Data */
+
 static inline struct gdma_context *mdev_to_gc(struct mana_ib_dev *mdev)
 {
 	return mdev->gdma_dev->gdma_context;
@@ -354,4 +406,8 @@ int mana_ib_gd_config_mac(struct mana_ib_dev *mdev, enum mana_ib_addr_op op, u8
 int mana_ib_gd_create_cq(struct mana_ib_dev *mdev, struct mana_ib_cq *cq, u32 doorbell);
 
 int mana_ib_gd_destroy_cq(struct mana_ib_dev *mdev, struct mana_ib_cq *cq);
+
+int mana_ib_gd_create_rc_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp,
+			    struct ib_qp_init_attr *attr, u32 doorbell, u64 flags);
+int mana_ib_gd_destroy_rc_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp);
 #endif
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create and destroy RC QP
  2024-05-07  9:53 [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Konstantin Taranov
  2024-05-07  9:53 ` [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP Konstantin Taranov
@ 2024-05-07  9:53 ` Konstantin Taranov
  2024-05-20 19:37   ` Long Li
  2024-05-07  9:53 ` [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state Konstantin Taranov
  2024-05-12  9:35 ` [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Leon Romanovsky
  3 siblings, 1 reply; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-07  9:53 UTC (permalink / raw)
  To: kotaranov, sharmaajay, longli, jgg, leon; +Cc: linux-rdma, linux-kernel

From: Konstantin Taranov <kotaranov@microsoft.com>

Implement user requests to create and destroy an RC QP.
As the user does not have an FMR queue, it is skipped and NO_FMR flag
is used.

Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
---
 drivers/infiniband/hw/mana/mana_ib.h |  4 ++
 drivers/infiniband/hw/mana/qp.c      | 93 +++++++++++++++++++++++++++-
 include/uapi/rdma/mana-abi.h         |  9 +++
 3 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/drivers/infiniband/hw/mana/mana_ib.h b/drivers/infiniband/hw/mana/mana_ib.h
index a3e229c..5cccbe3 100644
--- a/drivers/infiniband/hw/mana/mana_ib.h
+++ b/drivers/infiniband/hw/mana/mana_ib.h
@@ -248,6 +248,10 @@ struct mana_rnic_destroy_cq_resp {
 	struct gdma_resp_hdr hdr;
 }; /* HW Data */
 
+enum mana_rnic_create_rc_flags {
+	MANA_RC_FLAG_NO_FMR = 2,
+};
+
 struct mana_rnic_create_qp_req {
 	struct gdma_req_hdr hdr;
 	mana_handle_t adapter;
diff --git a/drivers/infiniband/hw/mana/qp.c b/drivers/infiniband/hw/mana/qp.c
index ba13c5a..14e6adb 100644
--- a/drivers/infiniband/hw/mana/qp.c
+++ b/drivers/infiniband/hw/mana/qp.c
@@ -398,6 +398,78 @@ err_free_vport:
 	return err;
 }
 
+static int mana_ib_create_rc_qp(struct ib_qp *ibqp, struct ib_pd *ibpd,
+				struct ib_qp_init_attr *attr, struct ib_udata *udata)
+{
+	struct mana_ib_dev *mdev = container_of(ibpd->device, struct mana_ib_dev, ib_dev);
+	struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);
+	struct mana_ib_create_rc_qp_resp resp = {};
+	struct mana_ib_ucontext *mana_ucontext;
+	struct mana_ib_create_rc_qp ucmd = {};
+	int i, err, j;
+	u64 flags = 0;
+	u32 doorbell;
+
+	if (!udata || udata->inlen < sizeof(ucmd))
+		return -EINVAL;
+
+	mana_ucontext = rdma_udata_to_drv_context(udata, struct mana_ib_ucontext, ibucontext);
+	doorbell = mana_ucontext->doorbell;
+	flags = MANA_RC_FLAG_NO_FMR;
+	err = ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata->inlen));
+	if (err) {
+		ibdev_dbg(&mdev->ib_dev, "Failed to copy from udata, %d\n", err);
+		return err;
+	}
+
+	for (i = 0, j = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i) {
+		// skip FMR for user-level RC QPs
+		if (i == MANA_RC_SEND_QUEUE_FMR) {
+			qp->rc_qp.queues[i].id = INVALID_QUEUE_ID;
+			qp->rc_qp.queues[i].gdma_region = GDMA_INVALID_DMA_REGION;
+			continue;
+		}
+		err = mana_ib_create_queue(mdev, ucmd.queue_buf[j], ucmd.queue_size[j],
+					   &qp->rc_qp.queues[i]);
+		if (err) {
+			ibdev_err(&mdev->ib_dev, "Failed to create queue %d, err %d\n", i, err);
+			goto destroy_queues;
+		}
+		j++;
+	}
+
+	err = mana_ib_gd_create_rc_qp(mdev, qp, attr, doorbell, flags);
+	if (err) {
+		ibdev_err(&mdev->ib_dev, "Failed to create rc qp  %d\n", err);
+		goto destroy_queues;
+	}
+	qp->ibqp.qp_num = qp->rc_qp.queues[MANA_RC_RECV_QUEUE_RESPONDER].id;
+	qp->port = attr->port_num;
+
+	if (udata) {
+		for (i = 0, j = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i) {
+			if (i == MANA_RC_SEND_QUEUE_FMR)
+				continue;
+			resp.queue_id[j] = qp->rc_qp.queues[i].id;
+			j++;
+		}
+		err = ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen));
+		if (err) {
+			ibdev_dbg(&mdev->ib_dev, "Failed to copy to udata, %d\n", err);
+			goto destroy_qp;
+		}
+	}
+
+	return 0;
+
+destroy_qp:
+	mana_ib_gd_destroy_rc_qp(mdev, qp);
+destroy_queues:
+	while (i-- > 0)
+		mana_ib_destroy_queue(mdev, &qp->rc_qp.queues[i]);
+	return err;
+}
+
 int mana_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
 		      struct ib_udata *udata)
 {
@@ -409,6 +481,8 @@ int mana_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
 						     udata);
 
 		return mana_ib_create_qp_raw(ibqp, ibqp->pd, attr, udata);
+	case IB_QPT_RC:
+		return mana_ib_create_rc_qp(ibqp, ibqp->pd, attr, udata);
 	default:
 		/* Creating QP other than IB_QPT_RAW_PACKET is not supported */
 		ibdev_dbg(ibqp->device, "Creating QP type %u not supported\n",
@@ -473,6 +547,22 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp *qp, struct ib_udata *udata)
 	return 0;
 }
 
+static int mana_ib_destroy_rc_qp(struct mana_ib_qp *qp, struct ib_udata *udata)
+{
+	struct mana_ib_dev *mdev =
+		container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
+	int i;
+
+	/* Ignore return code as there is not much we can do about it.
+	 * The error message is printed inside.
+	 */
+	mana_ib_gd_destroy_rc_qp(mdev, qp);
+	for (i = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i)
+		mana_ib_destroy_queue(mdev, &qp->rc_qp.queues[i]);
+
+	return 0;
+}
+
 int mana_ib_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
 {
 	struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);
@@ -484,7 +574,8 @@ int mana_ib_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
 						      udata);
 
 		return mana_ib_destroy_qp_raw(qp, udata);
-
+	case IB_QPT_RC:
+		return mana_ib_destroy_rc_qp(qp, udata);
 	default:
 		ibdev_dbg(ibqp->device, "Unexpected QP type %u\n",
 			  ibqp->qp_type);
diff --git a/include/uapi/rdma/mana-abi.h b/include/uapi/rdma/mana-abi.h
index 2c41cc3..45c2df6 100644
--- a/include/uapi/rdma/mana-abi.h
+++ b/include/uapi/rdma/mana-abi.h
@@ -45,6 +45,15 @@ struct mana_ib_create_qp_resp {
 	__u32 reserved;
 };
 
+struct mana_ib_create_rc_qp {
+	__aligned_u64 queue_buf[4];
+	__u32 queue_size[4];
+};
+
+struct mana_ib_create_rc_qp_resp {
+	__u32 queue_id[4];
+};
+
 struct mana_ib_create_wq {
 	__aligned_u64 wq_buf_addr;
 	__u32 wq_buf_size;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state
  2024-05-07  9:53 [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Konstantin Taranov
  2024-05-07  9:53 ` [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP Konstantin Taranov
  2024-05-07  9:53 ` [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create " Konstantin Taranov
@ 2024-05-07  9:53 ` Konstantin Taranov
  2024-05-20 19:49   ` Long Li
  2024-05-12  9:35 ` [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Leon Romanovsky
  3 siblings, 1 reply; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-07  9:53 UTC (permalink / raw)
  To: kotaranov, sharmaajay, longli, jgg, leon; +Cc: linux-rdma, linux-kernel

From: Konstantin Taranov <kotaranov@microsoft.com>

Implement modify QP state for RC QPs.

Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
---
 drivers/infiniband/hw/mana/mana_ib.h | 37 ++++++++++++++
 drivers/infiniband/hw/mana/qp.c      | 72 +++++++++++++++++++++++++++-
 2 files changed, 107 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/mana/mana_ib.h b/drivers/infiniband/hw/mana/mana_ib.h
index 5cccbe3..d29dee7 100644
--- a/drivers/infiniband/hw/mana/mana_ib.h
+++ b/drivers/infiniband/hw/mana/mana_ib.h
@@ -140,6 +140,7 @@ enum mana_ib_command_code {
 	MANA_IB_DESTROY_CQ      = 0x30009,
 	MANA_IB_CREATE_RC_QP    = 0x3000a,
 	MANA_IB_DESTROY_RC_QP   = 0x3000b,
+	MANA_IB_SET_QP_STATE	= 0x3000d,
 };
 
 struct mana_ib_query_adapter_caps_req {
@@ -286,6 +287,42 @@ struct mana_rnic_destroy_rc_qp_resp {
 	struct gdma_resp_hdr hdr;
 }; /* HW Data */
 
+struct mana_ib_ah_attr {
+	u8 src_addr[16];
+	u8 dest_addr[16];
+	u8 src_mac[ETH_ALEN];
+	u8 dest_mac[ETH_ALEN];
+	u8 src_addr_type;
+	u8 dest_addr_type;
+	u8 hop_limit;
+	u8 traffic_class;
+	u16 src_port;
+	u16 dest_port;
+	u32 reserved;
+};
+
+struct mana_rnic_set_qp_state_req {
+	struct gdma_req_hdr hdr;
+	mana_handle_t adapter;
+	mana_handle_t qp_handle;
+	u64 attr_mask;
+	u32 qp_state;
+	u32 path_mtu;
+	u32 rq_psn;
+	u32 sq_psn;
+	u32 dest_qpn;
+	u32 max_dest_rd_atomic;
+	u32 retry_cnt;
+	u32 rnr_retry;
+	u32 min_rnr_timer;
+	u32 reserved;
+	struct mana_ib_ah_attr ah_attr;
+}; /* HW Data */
+
+struct mana_rnic_set_qp_state_resp {
+	struct gdma_resp_hdr hdr;
+}; /* HW Data */
+
 static inline struct gdma_context *mdev_to_gc(struct mana_ib_dev *mdev)
 {
 	return mdev->gdma_dev->gdma_context;
diff --git a/drivers/infiniband/hw/mana/qp.c b/drivers/infiniband/hw/mana/qp.c
index 14e6adb..5393b6f 100644
--- a/drivers/infiniband/hw/mana/qp.c
+++ b/drivers/infiniband/hw/mana/qp.c
@@ -492,11 +492,79 @@ int mana_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
 	return -EINVAL;
 }
 
+static int mana_ib_gd_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
+				int attr_mask, struct ib_udata *udata)
+{
+	struct mana_ib_dev *mdev = container_of(ibqp->device, struct mana_ib_dev, ib_dev);
+	struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);
+	struct mana_rnic_set_qp_state_resp resp = {};
+	struct mana_rnic_set_qp_state_req req = {};
+	struct gdma_context *gc = mdev_to_gc(mdev);
+	struct mana_port_context *mpc;
+	struct net_device *ndev;
+	int err;
+
+	mana_gd_init_req_hdr(&req.hdr, MANA_IB_SET_QP_STATE, sizeof(req), sizeof(resp));
+	req.hdr.dev_id = gc->mana_ib.dev_id;
+	req.adapter = mdev->adapter_handle;
+	req.qp_handle = qp->qp_handle;
+	req.qp_state = attr->qp_state;
+	req.attr_mask = attr_mask;
+	req.path_mtu = attr->path_mtu;
+	req.rq_psn = attr->rq_psn;
+	req.sq_psn = attr->sq_psn;
+	req.dest_qpn = attr->dest_qp_num;
+	req.max_dest_rd_atomic = attr->max_dest_rd_atomic;
+	req.retry_cnt = attr->retry_cnt;
+	req.rnr_retry = attr->rnr_retry;
+	req.min_rnr_timer = attr->min_rnr_timer;
+	if (attr_mask & IB_QP_AV) {
+		ndev = mana_ib_get_netdev(&mdev->ib_dev, ibqp->port);
+		if (!ndev) {
+			ibdev_dbg(&mdev->ib_dev, "Invalid port %u in RC QP %u\n",
+				  ibqp->port, ibqp->qp_num);
+			return -EINVAL;
+		}
+		mpc = netdev_priv(ndev);
+		copy_in_reverse(req.ah_attr.src_mac, mpc->mac_addr, ETH_ALEN);
+		copy_in_reverse(req.ah_attr.dest_mac, attr->ah_attr.roce.dmac, ETH_ALEN);
+		copy_in_reverse(req.ah_attr.src_addr, attr->ah_attr.grh.sgid_attr->gid.raw,
+				sizeof(union ib_gid));
+		copy_in_reverse(req.ah_attr.dest_addr, attr->ah_attr.grh.dgid.raw,
+				sizeof(union ib_gid));
+		if (rdma_gid_attr_network_type(attr->ah_attr.grh.sgid_attr) == RDMA_NETWORK_IPV4) {
+			req.ah_attr.src_addr_type = SGID_TYPE_IPV4;
+			req.ah_attr.dest_addr_type = SGID_TYPE_IPV4;
+		} else {
+			req.ah_attr.src_addr_type = SGID_TYPE_IPV6;
+			req.ah_attr.dest_addr_type = SGID_TYPE_IPV6;
+		}
+		req.ah_attr.dest_port = ROCE_V2_UDP_DPORT;
+		req.ah_attr.src_port = rdma_get_udp_sport(attr->ah_attr.grh.flow_label,
+							  ibqp->qp_num, attr->dest_qp_num);
+		req.ah_attr.traffic_class = attr->ah_attr.grh.traffic_class;
+		req.ah_attr.hop_limit = attr->ah_attr.grh.hop_limit;
+	}
+
+	err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
+	if (err) {
+		ibdev_err(&mdev->ib_dev, "Failed modify qp err %d", err);
+		return err;
+	}
+
+	return 0;
+}
+
 int mana_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 		      int attr_mask, struct ib_udata *udata)
 {
-	/* modify_qp is not supported by this version of the driver */
-	return -EOPNOTSUPP;
+	switch (ibqp->qp_type) {
+	case IB_QPT_RC:
+		return mana_ib_gd_modify_qp(ibqp, attr, attr_mask, udata);
+	default:
+		ibdev_dbg(ibqp->device, "Modify QP type %u not supported", ibqp->qp_type);
+		return -EOPNOTSUPP;
+	}
 }
 
 static int mana_ib_destroy_qp_rss(struct mana_ib_qp *qp,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs
  2024-05-07  9:53 [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Konstantin Taranov
                   ` (2 preceding siblings ...)
  2024-05-07  9:53 ` [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state Konstantin Taranov
@ 2024-05-12  9:35 ` Leon Romanovsky
  2024-05-13  7:46   ` Konstantin Taranov
  3 siblings, 1 reply; 11+ messages in thread
From: Leon Romanovsky @ 2024-05-12  9:35 UTC (permalink / raw)
  To: Konstantin Taranov
  Cc: kotaranov, sharmaajay, longli, jgg, linux-rdma, linux-kernel

On Tue, May 07, 2024 at 02:53:12AM -0700, Konstantin Taranov wrote:
> From: Konstantin Taranov <kotaranov@microsoft.com>
> 
> This patch series enables creation and destruction of RC QPs.
> The RC QP can be transitioned to RTS and be used by rdma-core.
> 
> Later I will submit rdma-core patches with fully working RC QPs.

Did it happen?

I want to remind that we are not merging UAPI changes without relevant
userspace part.

Thanks

> 
> Konstantin Taranov (3):
>   RDMA/mana_ib: Create and destroy RC QP
>   RDMA/mana_ib: Implement uapi to create and destroy RC QP
>   RDMA/mana_ib: Modify QP state
> 
>  drivers/infiniband/hw/mana/main.c    |  59 ++++++++++
>  drivers/infiniband/hw/mana/mana_ib.h |  99 +++++++++++++++-
>  drivers/infiniband/hw/mana/qp.c      | 165 ++++++++++++++++++++++++++-
>  include/uapi/rdma/mana-abi.h         |   9 ++
>  4 files changed, 328 insertions(+), 4 deletions(-)
> 
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs
  2024-05-12  9:35 ` [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Leon Romanovsky
@ 2024-05-13  7:46   ` Konstantin Taranov
  2024-05-15 18:56     ` Konstantin Taranov
  0 siblings, 1 reply; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-13  7:46 UTC (permalink / raw)
  To: Leon Romanovsky, Konstantin Taranov
  Cc: sharmaajay, Long Li, jgg, linux-rdma, linux-kernel

> -----Original Message-----
> From: Leon Romanovsky <leon@kernel.org>
> Sent: Sunday, 12 May 2024 11:36
> To: Konstantin Taranov <kotaranov@linux.microsoft.com>
> Cc: Konstantin Taranov <kotaranov@microsoft.com>;
> sharmaajay@microsoft.com; Long Li <longli@microsoft.com>; jgg@ziepe.ca;
> linux-rdma@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: [EXTERNAL] Re: [PATCH rdma-next 0/3] RDMA/mana_ib: Add
> support of RC QPs
> 
> On Tue, May 07, 2024 at 02:53:12AM -0700, Konstantin Taranov wrote:
> > From: Konstantin Taranov <kotaranov@microsoft.com>
> >
> > This patch series enables creation and destruction of RC QPs.
> > The RC QP can be transitioned to RTS and be used by rdma-core.
> >
> > Later I will submit rdma-core patches with fully working RC QPs.
> 
> Did it happen?
> 
> I want to remind that we are not merging UAPI changes without relevant
> userspace part.

Sorry, I missed this requirement. Thanks for informing!
I will submit it within next 2 days.

Konstantin

> 
> Thanks
> 
> >
> > Konstantin Taranov (3):
> >   RDMA/mana_ib: Create and destroy RC QP
> >   RDMA/mana_ib: Implement uapi to create and destroy RC QP
> >   RDMA/mana_ib: Modify QP state
> >
> >  drivers/infiniband/hw/mana/main.c    |  59 ++++++++++
> >  drivers/infiniband/hw/mana/mana_ib.h |  99 +++++++++++++++-
> >  drivers/infiniband/hw/mana/qp.c      | 165
> ++++++++++++++++++++++++++-
> >  include/uapi/rdma/mana-abi.h         |   9 ++
> >  4 files changed, 328 insertions(+), 4 deletions(-)
> >
> > --
> > 2.43.0
> >


^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs
  2024-05-13  7:46   ` Konstantin Taranov
@ 2024-05-15 18:56     ` Konstantin Taranov
  0 siblings, 0 replies; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-15 18:56 UTC (permalink / raw)
  To: Konstantin Taranov, Leon Romanovsky, Konstantin Taranov
  Cc: sharmaajay, Long Li, jgg, linux-rdma, linux-kernel

> > > Later I will submit rdma-core patches with fully working RC QPs.
> >
> > Did it happen?
> >
> > I want to remind that we are not merging UAPI changes without relevant
> > userspace part.
> 
> Sorry, I missed this requirement. Thanks for informing!
> I will submit it within next 2 days.

Here is the PR to the rdma-core:
https://github.com/linux-rdma/rdma-core/pull/1461

Thanks

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create and destroy RC QP
  2024-05-07  9:53 ` [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create " Konstantin Taranov
@ 2024-05-20 19:37   ` Long Li
  2024-05-21  8:48     ` Konstantin Taranov
  0 siblings, 1 reply; 11+ messages in thread
From: Long Li @ 2024-05-20 19:37 UTC (permalink / raw)
  To: Konstantin Taranov, Konstantin Taranov, sharmaajay, jgg, leon
  Cc: linux-rdma, linux-kernel

> Subject: [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create and
> destroy RC QP
> 
> From: Konstantin Taranov <kotaranov@microsoft.com>
> 
> Implement user requests to create and destroy an RC QP.
> As the user does not have an FMR queue, it is skipped and NO_FMR flag is used.
> 
> Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
> ---
>  drivers/infiniband/hw/mana/mana_ib.h |  4 ++
>  drivers/infiniband/hw/mana/qp.c      | 93 +++++++++++++++++++++++++++-
>  include/uapi/rdma/mana-abi.h         |  9 +++
>  3 files changed, 105 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/infiniband/hw/mana/mana_ib.h
> b/drivers/infiniband/hw/mana/mana_ib.h
> index a3e229c..5cccbe3 100644
> --- a/drivers/infiniband/hw/mana/mana_ib.h
> +++ b/drivers/infiniband/hw/mana/mana_ib.h
> @@ -248,6 +248,10 @@ struct mana_rnic_destroy_cq_resp {
>  	struct gdma_resp_hdr hdr;
>  }; /* HW Data */
> 
> +enum mana_rnic_create_rc_flags {
> +	MANA_RC_FLAG_NO_FMR = 2,
> +};
> +
>  struct mana_rnic_create_qp_req {
>  	struct gdma_req_hdr hdr;
>  	mana_handle_t adapter;
> diff --git a/drivers/infiniband/hw/mana/qp.c b/drivers/infiniband/hw/mana/qp.c
> index ba13c5a..14e6adb 100644
> --- a/drivers/infiniband/hw/mana/qp.c
> +++ b/drivers/infiniband/hw/mana/qp.c
> @@ -398,6 +398,78 @@ err_free_vport:
>  	return err;
>  }
> 
> +static int mana_ib_create_rc_qp(struct ib_qp *ibqp, struct ib_pd *ibpd,
> +				struct ib_qp_init_attr *attr, struct ib_udata
> *udata) {
> +	struct mana_ib_dev *mdev = container_of(ibpd->device, struct
> mana_ib_dev, ib_dev);
> +	struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);
> +	struct mana_ib_create_rc_qp_resp resp = {};
> +	struct mana_ib_ucontext *mana_ucontext;
> +	struct mana_ib_create_rc_qp ucmd = {};
> +	int i, err, j;
> +	u64 flags = 0;
> +	u32 doorbell;
> +
> +	if (!udata || udata->inlen < sizeof(ucmd))
> +		return -EINVAL;
> +
> +	mana_ucontext = rdma_udata_to_drv_context(udata, struct
> mana_ib_ucontext, ibucontext);
> +	doorbell = mana_ucontext->doorbell;
> +	flags = MANA_RC_FLAG_NO_FMR;
> +	err = ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata-
> >inlen));
> +	if (err) {
> +		ibdev_dbg(&mdev->ib_dev, "Failed to copy from udata, %d\n",
> err);
> +		return err;
> +	}
> +
> +	for (i = 0, j = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i) {
> +		// skip FMR for user-level RC QPs
> +		if (i == MANA_RC_SEND_QUEUE_FMR) {
> +			qp->rc_qp.queues[i].id = INVALID_QUEUE_ID;
> +			qp->rc_qp.queues[i].gdma_region =
> GDMA_INVALID_DMA_REGION;
> +			continue;
> +		}
> +		err = mana_ib_create_queue(mdev, ucmd.queue_buf[j],
> ucmd.queue_size[j],
> +					   &qp->rc_qp.queues[i]);
> +		if (err) {
> +			ibdev_err(&mdev->ib_dev, "Failed to create queue %d,
> err %d\n", i, err);
> +			goto destroy_queues;
> +		}
> +		j++;
> +	}
> +
> +	err = mana_ib_gd_create_rc_qp(mdev, qp, attr, doorbell, flags);
> +	if (err) {
> +		ibdev_err(&mdev->ib_dev, "Failed to create rc qp  %d\n", err);
> +		goto destroy_queues;
> +	}
> +	qp->ibqp.qp_num = qp-
> >rc_qp.queues[MANA_RC_RECV_QUEUE_RESPONDER].id;
> +	qp->port = attr->port_num;
> +
> +	if (udata) {
> +		for (i = 0, j = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i) {
> +			if (i == MANA_RC_SEND_QUEUE_FMR)
> +				continue;
> +			resp.queue_id[j] = qp->rc_qp.queues[i].id;
> +			j++;
> +		}
> +		err = ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata-
> >outlen));
> +		if (err) {
> +			ibdev_dbg(&mdev->ib_dev, "Failed to copy to
> udata, %d\n", err);
> +			goto destroy_qp;
> +		}
> +	}
> +
> +	return 0;
> +
> +destroy_qp:
> +	mana_ib_gd_destroy_rc_qp(mdev, qp);
> +destroy_queues:
> +	while (i-- > 0)
> +		mana_ib_destroy_queue(mdev, &qp->rc_qp.queues[i]);
> +	return err;
> +}
> +
>  int mana_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
>  		      struct ib_udata *udata)
>  {
> @@ -409,6 +481,8 @@ int mana_ib_create_qp(struct ib_qp *ibqp, struct
> ib_qp_init_attr *attr,
>  						     udata);
> 
>  		return mana_ib_create_qp_raw(ibqp, ibqp->pd, attr, udata);
> +	case IB_QPT_RC:
> +		return mana_ib_create_rc_qp(ibqp, ibqp->pd, attr, udata);
>  	default:
>  		/* Creating QP other than IB_QPT_RAW_PACKET is not
> supported */


Need to change this comment as RC is supported now.


>  		ibdev_dbg(ibqp->device, "Creating QP type %u not supported\n",
> @@ -473,6 +547,22 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp
> *qp, struct ib_udata *udata)
>  	return 0;
>  }
> 
> +static int mana_ib_destroy_rc_qp(struct mana_ib_qp *qp, struct ib_udata
> +*udata) {
> +	struct mana_ib_dev *mdev =
> +		container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
> +	int i;
> +
> +	/* Ignore return code as there is not much we can do about it.
> +	 * The error message is printed inside.
> +	 */
> +	mana_ib_gd_destroy_rc_qp(mdev, qp);
> +	for (i = 0; i < MANA_RC_QUEUE_TYPE_MAX; ++i)
> +		mana_ib_destroy_queue(mdev, &qp->rc_qp.queues[i]);
> +
> +	return 0;
> +}
> +
>  int mana_ib_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)  {
>  	struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);
> @@ -484,7 +574,8 @@ int mana_ib_destroy_qp(struct ib_qp *ibqp, struct
> ib_udata *udata)
>  						      udata);
> 
>  		return mana_ib_destroy_qp_raw(qp, udata);
> -
> +	case IB_QPT_RC:
> +		return mana_ib_destroy_rc_qp(qp, udata);
>  	default:
>  		ibdev_dbg(ibqp->device, "Unexpected QP type %u\n",
>  			  ibqp->qp_type);
> diff --git a/include/uapi/rdma/mana-abi.h b/include/uapi/rdma/mana-abi.h
> index 2c41cc3..45c2df6 100644
> --- a/include/uapi/rdma/mana-abi.h
> +++ b/include/uapi/rdma/mana-abi.h
> @@ -45,6 +45,15 @@ struct mana_ib_create_qp_resp {
>  	__u32 reserved;
>  };
> 
> +struct mana_ib_create_rc_qp {
> +	__aligned_u64 queue_buf[4];
> +	__u32 queue_size[4];
> +};
> +
> +struct mana_ib_create_rc_qp_resp {
> +	__u32 queue_id[4];
> +};
> +


You are adding new UAPI without changing MANA_IB_UVERBS_ABI_VERSION.

For this use-case, I think it's okay because it will fail to create CQ before this. But it may not be a good customer experience for RC usage.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP
  2024-05-07  9:53 ` [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP Konstantin Taranov
@ 2024-05-20 19:40   ` Long Li
  0 siblings, 0 replies; 11+ messages in thread
From: Long Li @ 2024-05-20 19:40 UTC (permalink / raw)
  To: Konstantin Taranov, Konstantin Taranov, sharmaajay, jgg, leon
  Cc: linux-rdma, linux-kernel

> Subject: [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP
> 
> From: Konstantin Taranov <kotaranov@microsoft.com>
> 
> Implement HW requests to create and destroy an RC QP.
> An RC QP may have 5 queues.
> 
> Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>

Reviewed-by: Long Li <longli@microsoft.com>



^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state
  2024-05-07  9:53 ` [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state Konstantin Taranov
@ 2024-05-20 19:49   ` Long Li
  0 siblings, 0 replies; 11+ messages in thread
From: Long Li @ 2024-05-20 19:49 UTC (permalink / raw)
  To: Konstantin Taranov, Konstantin Taranov, sharmaajay, jgg, leon
  Cc: linux-rdma, linux-kernel

> Subject: [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state
> 
> From: Konstantin Taranov <kotaranov@microsoft.com>
> 
> Implement modify QP state for RC QPs.
> 
> Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>


Reviewed-by: Long Li <longli@microsoft.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create and destroy RC QP
  2024-05-20 19:37   ` Long Li
@ 2024-05-21  8:48     ` Konstantin Taranov
  0 siblings, 0 replies; 11+ messages in thread
From: Konstantin Taranov @ 2024-05-21  8:48 UTC (permalink / raw)
  To: Long Li, Konstantin Taranov, sharmaajay, jgg, leon
  Cc: linux-rdma, linux-kernel

> 
> Need to change this comment as RC is supported now.
> 

Thanks, fixed.

> 
> You are adding new UAPI without changing
> MANA_IB_UVERBS_ABI_VERSION.
> 
> For this use-case, I think it's okay because it will fail to create CQ before this.
> But it may not be a good customer experience for RC usage.

ABI versions are for resolving incompatibilities in API, and not for tracking features.
So If a user fails to create an RC QP it means the kernel is old and does not have this feature.
The customer experience is not affected.

Increase in the abi version would invalidate all previous kernels, preventing clients to use the
many versions of kernels and rdma-core together. As a result, breaking the customer experience.

Konstantin

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2024-05-21  8:48 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-07  9:53 [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Konstantin Taranov
2024-05-07  9:53 ` [PATCH rdma-next 1/3] RDMA/mana_ib: Create and destroy RC QP Konstantin Taranov
2024-05-20 19:40   ` Long Li
2024-05-07  9:53 ` [PATCH rdma-next 2/3] RDMA/mana_ib: Implement uapi to create " Konstantin Taranov
2024-05-20 19:37   ` Long Li
2024-05-21  8:48     ` Konstantin Taranov
2024-05-07  9:53 ` [PATCH rdma-next 3/3] RDMA/mana_ib: Modify QP state Konstantin Taranov
2024-05-20 19:49   ` Long Li
2024-05-12  9:35 ` [PATCH rdma-next 0/3] RDMA/mana_ib: Add support of RC QPs Leon Romanovsky
2024-05-13  7:46   ` Konstantin Taranov
2024-05-15 18:56     ` Konstantin Taranov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).