All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH for-next 0/4] Support rq record doorbell and cq record doorbell
@ 2018-01-18  2:34 Yixian Liu
       [not found] ` <1516242871-154089-1-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Yixian Liu @ 2018-01-18  2:34 UTC (permalink / raw)
  To: leon-DgEjT+Ai2ygdnm+yROfE0A, jgg-uk2M96/98Pc
  Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA, linux-rdma-u79uwXL29TY76Z2rM5mHXA

This patch set updates to support rq record doorbell and
cq record doorbell in the user space and kernel space.

Yixian Liu (4):
  RDMA/hns: Support rq record doorbell for the user space
  RDMA/hns: Support cq record doorbell for the user space
  RDMA/hns: Support rq record doorbell for kernel space
  RDMA/hns: Support cq record doorbell for kernel space

 drivers/infiniband/hw/hns/Makefile          |   2 +-
 drivers/infiniband/hw/hns/hns_roce_cq.c     |  44 +++++-
 drivers/infiniband/hw/hns/hns_roce_db.c     | 206 ++++++++++++++++++++++++++++
 drivers/infiniband/hw/hns/hns_roce_device.h |  49 ++++++-
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  65 ++++-----
 drivers/infiniband/hw/hns/hns_roce_hw_v2.h  |   3 +
 drivers/infiniband/hw/hns/hns_roce_main.c   |  10 ++
 drivers/infiniband/hw/hns/hns_roce_qp.c     |  50 ++++++-
 include/uapi/rdma/hns-abi.h                 |   1 +
 9 files changed, 390 insertions(+), 40 deletions(-)
 create mode 100644 drivers/infiniband/hw/hns/hns_roce_db.c

-- 
1.9.1

--
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] 12+ messages in thread

* [PATCH for-next 1/4] RDMA/hns: Support rq record doorbell for the user space
       [not found] ` <1516242871-154089-1-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2018-01-18  2:34   ` Yixian Liu
       [not found]     ` <1516242871-154089-2-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  2018-01-18  2:34   ` [PATCH for-next 2/4] RDMA/hns: Support cq " Yixian Liu
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Yixian Liu @ 2018-01-18  2:34 UTC (permalink / raw)
  To: leon-DgEjT+Ai2ygdnm+yROfE0A, jgg-uk2M96/98Pc
  Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA, linux-rdma-u79uwXL29TY76Z2rM5mHXA

This patch adds interfaces and definitions to support the rq record
doorbell for the user space.

Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 drivers/infiniband/hw/hns/Makefile          |  2 +-
 drivers/infiniband/hw/hns/hns_roce_db.c     | 94 +++++++++++++++++++++++++++++
 drivers/infiniband/hw/hns/hns_roce_device.h | 41 ++++++++++++-
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 22 ++++++-
 drivers/infiniband/hw/hns/hns_roce_main.c   |  5 ++
 drivers/infiniband/hw/hns/hns_roce_qp.c     | 32 +++++++++-
 6 files changed, 191 insertions(+), 5 deletions(-)
 create mode 100644 drivers/infiniband/hw/hns/hns_roce_db.c

diff --git a/drivers/infiniband/hw/hns/Makefile b/drivers/infiniband/hw/hns/Makefile
index 97bf2cd..cf03404 100644
--- a/drivers/infiniband/hw/hns/Makefile
+++ b/drivers/infiniband/hw/hns/Makefile
@@ -7,7 +7,7 @@ ccflags-y :=  -Idrivers/net/ethernet/hisilicon/hns3
 obj-$(CONFIG_INFINIBAND_HNS) += hns-roce.o
 hns-roce-objs := hns_roce_main.o hns_roce_cmd.o hns_roce_pd.o \
 	hns_roce_ah.o hns_roce_hem.o hns_roce_mr.o hns_roce_qp.o \
-	hns_roce_cq.o hns_roce_alloc.o
+	hns_roce_cq.o hns_roce_alloc.o hns_roce_db.o
 obj-$(CONFIG_INFINIBAND_HNS_HIP06) += hns-roce-hw-v1.o
 hns-roce-hw-v1-objs := hns_roce_hw_v1.o
 obj-$(CONFIG_INFINIBAND_HNS_HIP08) += hns-roce-hw-v2.o
diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
new file mode 100644
index 0000000..0908208
--- /dev/null
+++ b/drivers/infiniband/hw/hns/hns_roce_db.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2017 Hisilicon Limited.
+ * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <linux/platform_device.h>
+#include <rdma/ib_umem.h>
+#include "hns_roce_device.h"
+
+int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
+			 struct hns_roce_db *db)
+{
+	struct hns_roce_user_db_page *db_page;
+	int ret = 0;
+
+	mutex_lock(&context->db_page_mutex);
+
+	list_for_each_entry(db_page, &context->db_page_list, list)
+		if (db_page->user_virt == (virt & PAGE_MASK))
+			goto found;
+
+	db_page = kmalloc(sizeof(*db_page), GFP_KERNEL);
+	if (!db_page) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	db_page->user_virt = (virt & PAGE_MASK);
+	db_page->refcnt    = 0;
+	db_page->umem      = ib_umem_get(&context->ibucontext, virt & PAGE_MASK,
+					 PAGE_SIZE, 0, 0);
+	if (IS_ERR(db_page->umem)) {
+		ret = PTR_ERR(db_page->umem);
+		kfree(db_page);
+		goto out;
+	}
+
+	list_add(&db_page->list, &context->db_page_list);
+
+found:
+	db->dma = sg_dma_address(db_page->umem->sg_head.sgl) +
+		  (virt & ~PAGE_MASK);
+	db->u.user_page = db_page;
+	++db_page->refcnt;
+
+out:
+	mutex_unlock(&context->db_page_mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL(hns_roce_db_map_user);
+
+void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
+			    struct hns_roce_db *db)
+{
+	mutex_lock(&context->db_page_mutex);
+
+	if (!--db->u.user_page->refcnt) {
+		list_del(&db->u.user_page->list);
+		ib_umem_release(db->u.user_page->umem);
+		kfree(db->u.user_page);
+	}
+
+	mutex_unlock(&context->db_page_mutex);
+}
+EXPORT_SYMBOL(hns_roce_db_unmap_user);
diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
index 42c3b5a..65c09c5 100644
--- a/drivers/infiniband/hw/hns/hns_roce_device.h
+++ b/drivers/infiniband/hw/hns/hns_roce_device.h
@@ -178,7 +178,8 @@ enum {
 enum {
 	HNS_ROCE_CAP_FLAG_REREG_MR		= BIT(0),
 	HNS_ROCE_CAP_FLAG_ROCE_V1_V2		= BIT(1),
-	HNS_ROCE_CAP_FLAG_RQ_INLINE		= BIT(2)
+	HNS_ROCE_CAP_FLAG_RQ_INLINE		= BIT(2),
+	HNS_ROCE_CAP_FLAG_RECORD_DB		= BIT(3)
 };
 
 enum hns_roce_mtt_type {
@@ -186,6 +187,10 @@ enum hns_roce_mtt_type {
 	MTT_TYPE_CQE,
 };
 
+enum {
+	HNS_ROCE_DB_PER_PAGE = PAGE_SIZE / 4
+};
+
 #define HNS_ROCE_CMD_SUCCESS			1
 
 #define HNS_ROCE_PORT_DOWN			0
@@ -203,6 +208,8 @@ struct hns_roce_uar {
 struct hns_roce_ucontext {
 	struct ib_ucontext	ibucontext;
 	struct hns_roce_uar	uar;
+	struct list_head	db_page_list;
+	struct mutex		db_page_mutex;
 };
 
 struct hns_roce_pd {
@@ -335,6 +342,33 @@ struct hns_roce_buf {
 	int				page_shift;
 };
 
+struct hns_roce_db_pgdir {
+	struct list_head	list;
+	DECLARE_BITMAP(order0, HNS_ROCE_DB_PER_PAGE);
+	DECLARE_BITMAP(order1, HNS_ROCE_DB_PER_PAGE / 2);
+	unsigned long		*bits[2];
+	u32			*db_page;
+	dma_addr_t		db_dma;
+};
+
+struct hns_roce_user_db_page {
+	struct list_head	list;
+	struct ib_umem		*umem;
+	unsigned long		user_virt;
+	int			refcnt;
+};
+
+struct hns_roce_db {
+	u32		*db_record;
+	union {
+		struct hns_roce_db_pgdir *pgdir;
+		struct hns_roce_user_db_page *user_page;
+	} u;
+	dma_addr_t	dma;
+	int		index;
+	int		order;
+};
+
 struct hns_roce_cq_buf {
 	struct hns_roce_buf hr_buf;
 	struct hns_roce_mtt hr_mtt;
@@ -465,6 +499,7 @@ struct hns_roce_rinl_buf {
 struct hns_roce_qp {
 	struct ib_qp		ibqp;
 	struct hns_roce_buf	hr_buf;
+	struct hns_roce_db	rdb;
 	struct hns_roce_wq	rq;
 	__le64			doorbell_qpn;
 	__le32			sq_signal_bits;
@@ -930,6 +965,10 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq);
 void hns_roce_free_cq(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq);
 
+int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
+			 struct hns_roce_db *db);
+void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
+			    struct hns_roce_db *db);
 void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
 void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
 void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index 256fe11..e0f4dc4 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -1140,7 +1140,8 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
 
 	caps->flags		= HNS_ROCE_CAP_FLAG_REREG_MR |
 				  HNS_ROCE_CAP_FLAG_ROCE_V1_V2 |
-				  HNS_ROCE_CAP_FLAG_RQ_INLINE;
+				  HNS_ROCE_CAP_FLAG_RQ_INLINE |
+				  HNS_ROCE_CAP_FLAG_RECORD_DB;
 	caps->pkey_table_len[0] = 1;
 	caps->gid_table_len[0] = HNS_ROCE_V2_GID_INDEX_NUM;
 	caps->ceqe_depth	= HNS_ROCE_V2_COMP_EQE_NUM;
@@ -2246,6 +2247,19 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
 		hr_qp->qkey = attr->qkey;
 	}
 
+	roce_set_bit(context->byte_68_rq_db, V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1);
+	roce_set_bit(qpc_mask->byte_68_rq_db, V2_QPC_BYTE_68_RQ_RECORD_EN_S, 0);
+
+	roce_set_field(context->byte_68_rq_db,
+		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M,
+		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S,
+		       ((u32)hr_qp->rdb.dma) >> 1);
+	roce_set_field(qpc_mask->byte_68_rq_db,
+		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M,
+		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S, 0);
+	context->rq_db_record_addr = hr_qp->rdb.dma >> 32;
+	qpc_mask->rq_db_record_addr = 0;
+
 	roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 1);
 	roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 0);
 
@@ -3183,6 +3197,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
 		hr_qp->sq.tail = 0;
 		hr_qp->sq_next_wqe = 0;
 		hr_qp->next_sge = 0;
+		if (hr_qp->rq.wqe_cnt)
+			*hr_qp->rdb.db_record = 0;
 	}
 
 out:
@@ -3409,6 +3425,10 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
 	hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt);
 
 	if (is_user) {
+		if (hr_qp->rq.wqe_cnt)
+			hns_roce_db_unmap_user(
+				to_hr_ucontext(hr_qp->ibqp.uobject->context),
+				&hr_qp->rdb);
 		ib_umem_release(hr_qp->umem);
 	} else {
 		kfree(hr_qp->sq.wrid);
diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
index aa0c242..dd7d882 100644
--- a/drivers/infiniband/hw/hns/hns_roce_main.c
+++ b/drivers/infiniband/hw/hns/hns_roce_main.c
@@ -350,6 +350,11 @@ static struct ib_ucontext *hns_roce_alloc_ucontext(struct ib_device *ib_dev,
 	if (ret)
 		goto error_fail_uar_alloc;
 
+	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
+		INIT_LIST_HEAD(&context->db_page_list);
+		mutex_init(&context->db_page_mutex);
+	}
+
 	ret = ib_copy_to_udata(udata, &resp, sizeof(resp));
 	if (ret)
 		goto error_fail_copy_to_udata;
diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
index 4414cea..300f760 100644
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -489,6 +489,15 @@ static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev,
 	return 0;
 }
 
+static int hns_roce_qp_has_rq(struct ib_qp_init_attr *attr)
+{
+	if (attr->qp_type == IB_QPT_XRC_INI ||
+	    attr->qp_type == IB_QPT_XRC_TGT || attr->srq)
+		return 0;
+
+	return 1;
+}
+
 static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 				     struct ib_pd *ib_pd,
 				     struct ib_qp_init_attr *init_attr,
@@ -602,6 +611,17 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 			dev_err(dev, "hns_roce_ib_umem_write_mtt error for create qp\n");
 			goto err_mtt;
 		}
+
+		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
+		    hns_roce_qp_has_rq(init_attr)) {
+			ret = hns_roce_db_map_user(
+					to_hr_ucontext(ib_pd->uobject->context),
+					ucmd.db_addr, &hr_qp->rdb);
+			if (ret) {
+				dev_err(dev, "rp record doorbell map failed!\n");
+				goto err_mtt;
+			}
+		}
 	} else {
 		if (init_attr->create_flags &
 		    IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) {
@@ -707,8 +727,16 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 		hns_roce_release_range_qp(hr_dev, qpn, 1);
 
 err_wrid:
-	kfree(hr_qp->sq.wrid);
-	kfree(hr_qp->rq.wrid);
+	if (ib_pd->uobject) {
+		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
+		    hns_roce_qp_has_rq(init_attr))
+			hns_roce_db_unmap_user(
+					to_hr_ucontext(ib_pd->uobject->context),
+					&hr_qp->rdb);
+	} else {
+		kfree(hr_qp->sq.wrid);
+		kfree(hr_qp->rq.wrid);
+	}
 
 err_mtt:
 	hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt);
-- 
1.9.1

--
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] 12+ messages in thread

* [PATCH for-next 2/4] RDMA/hns: Support cq record doorbell for the user space
       [not found] ` <1516242871-154089-1-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  2018-01-18  2:34   ` [PATCH for-next 1/4] RDMA/hns: Support rq record doorbell for the user space Yixian Liu
@ 2018-01-18  2:34   ` Yixian Liu
  2018-01-18  2:34   ` [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space Yixian Liu
  2018-01-18  2:34   ` [PATCH for-next 4/4] RDMA/hns: Support cq " Yixian Liu
  3 siblings, 0 replies; 12+ messages in thread
From: Yixian Liu @ 2018-01-18  2:34 UTC (permalink / raw)
  To: leon-DgEjT+Ai2ygdnm+yROfE0A, jgg-uk2M96/98Pc
  Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA, linux-rdma-u79uwXL29TY76Z2rM5mHXA

This patch updates to support cq record doorbell for
the user space.

Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 drivers/infiniband/hw/hns/hns_roce_cq.c     | 26 +++++++++++++++++++++++---
 drivers/infiniband/hw/hns/hns_roce_device.h |  1 +
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  9 +++++++++
 drivers/infiniband/hw/hns/hns_roce_hw_v2.h  |  3 +++
 include/uapi/rdma/hns-abi.h                 |  1 +
 5 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/infiniband/hw/hns/hns_roce_cq.c b/drivers/infiniband/hw/hns/hns_roce_cq.c
index bccc9b5..918960d 100644
--- a/drivers/infiniband/hw/hns/hns_roce_cq.c
+++ b/drivers/infiniband/hw/hns/hns_roce_cq.c
@@ -354,6 +354,15 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 			goto err_cq;
 		}
 
+		if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
+			ret = hns_roce_db_map_user(to_hr_ucontext(context),
+						   ucmd.db_addr, &hr_cq->db);
+			if (ret) {
+				dev_err(dev, "cq record doorbell map failed!\n");
+				goto err_mtt;
+			}
+		}
+
 		/* Get user space parameters */
 		uar = &to_hr_ucontext(context)->uar;
 	} else {
@@ -375,7 +384,7 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 				hr_cq, vector);
 	if (ret) {
 		dev_err(dev, "Creat CQ .Failed to cq_alloc.\n");
-		goto err_mtt;
+		goto err_dbmap;
 	}
 
 	/*
@@ -404,6 +413,11 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 err_cqc:
 	hns_roce_free_cq(hr_dev, hr_cq);
 
+err_dbmap:
+	if (context && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
+		hns_roce_db_unmap_user(to_hr_ucontext(context),
+				       &hr_cq->db);
+
 err_mtt:
 	hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt);
 	if (context)
@@ -430,12 +444,18 @@ int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq)
 		hns_roce_free_cq(hr_dev, hr_cq);
 		hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt);
 
-		if (ib_cq->uobject)
+		if (ib_cq->uobject) {
 			ib_umem_release(hr_cq->umem);
-		else
+
+			if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)
+				hns_roce_db_unmap_user(
+					to_hr_ucontext(ib_cq->uobject->context),
+					&hr_cq->db);
+		} else {
 			/* Free the buff of stored cq */
 			hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf,
 						ib_cq->cqe);
+		}
 
 		kfree(hr_cq);
 	}
diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
index 65c09c5..9ee6da6 100644
--- a/drivers/infiniband/hw/hns/hns_roce_device.h
+++ b/drivers/infiniband/hw/hns/hns_roce_device.h
@@ -376,6 +376,7 @@ struct hns_roce_cq_buf {
 
 struct hns_roce_cq {
 	struct ib_cq			ib_cq;
+	struct hns_roce_db		db;
 	struct hns_roce_cq_buf		hr_buf;
 	spinlock_t			lock;
 	struct ib_umem			*umem;
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index e0f4dc4..07129d2 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -1610,6 +1610,15 @@ static void hns_roce_v2_write_cqc(struct hns_roce_dev *hr_dev,
 	roce_set_field(cq_context->byte_40_cqe_ba, V2_CQC_BYTE_40_CQE_BA_M,
 		       V2_CQC_BYTE_40_CQE_BA_S, (dma_handle >> (32 + 3)));
 
+	roce_set_bit(cq_context->byte_44_db_record,
+		     V2_CQC_BYTE_44_DB_RECORD_EN_S, 1);
+
+	roce_set_field(cq_context->byte_44_db_record,
+		       V2_CQC_BYTE_44_DB_RECORD_ADDR_M,
+		       V2_CQC_BYTE_44_DB_RECORD_ADDR_S,
+		       ((u32)hr_cq->db.dma) >> 1);
+	cq_context->db_record_addr = hr_cq->db.dma >> 32;
+
 	roce_set_field(cq_context->byte_56_cqe_period_maxcnt,
 		       V2_CQC_BYTE_56_CQ_MAX_CNT_M,
 		       V2_CQC_BYTE_56_CQ_MAX_CNT_S,
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
index 960df09..e022fb5 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
@@ -299,6 +299,9 @@ struct hns_roce_v2_cq_context {
 
 #define	V2_CQC_BYTE_44_DB_RECORD_EN_S 0
 
+#define	V2_CQC_BYTE_44_DB_RECORD_ADDR_S 1
+#define	V2_CQC_BYTE_44_DB_RECORD_ADDR_M GENMASK(31, 1)
+
 #define	V2_CQC_BYTE_52_CQE_CNT_S 0
 #define	V2_CQC_BYTE_52_CQE_CNT_M GENMASK(23, 0)
 
diff --git a/include/uapi/rdma/hns-abi.h b/include/uapi/rdma/hns-abi.h
index a9c03b0..ab66057 100644
--- a/include/uapi/rdma/hns-abi.h
+++ b/include/uapi/rdma/hns-abi.h
@@ -38,6 +38,7 @@
 
 struct hns_roce_ib_create_cq {
 	__u64   buf_addr;
+	__u64	db_addr;
 };
 
 struct hns_roce_ib_create_qp {
-- 
1.9.1

--
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] 12+ messages in thread

* [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space
       [not found] ` <1516242871-154089-1-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  2018-01-18  2:34   ` [PATCH for-next 1/4] RDMA/hns: Support rq record doorbell for the user space Yixian Liu
  2018-01-18  2:34   ` [PATCH for-next 2/4] RDMA/hns: Support cq " Yixian Liu
@ 2018-01-18  2:34   ` Yixian Liu
       [not found]     ` <1516242871-154089-4-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  2018-01-18  2:34   ` [PATCH for-next 4/4] RDMA/hns: Support cq " Yixian Liu
  3 siblings, 1 reply; 12+ messages in thread
From: Yixian Liu @ 2018-01-18  2:34 UTC (permalink / raw)
  To: leon-DgEjT+Ai2ygdnm+yROfE0A, jgg-uk2M96/98Pc
  Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA, linux-rdma-u79uwXL29TY76Z2rM5mHXA

This patch updates to support rq record doorbell for
the kernel space.

Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 drivers/infiniband/hw/hns/hns_roce_db.c     | 112 ++++++++++++++++++++++++++++
 drivers/infiniband/hw/hns/hns_roce_device.h |   6 ++
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  15 +---
 drivers/infiniband/hw/hns/hns_roce_main.c   |   5 ++
 drivers/infiniband/hw/hns/hns_roce_qp.c     |  18 ++++-
 5 files changed, 143 insertions(+), 13 deletions(-)

diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
index 0908208..de3fa94 100644
--- a/drivers/infiniband/hw/hns/hns_roce_db.c
+++ b/drivers/infiniband/hw/hns/hns_roce_db.c
@@ -92,3 +92,115 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
 	mutex_unlock(&context->db_page_mutex);
 }
 EXPORT_SYMBOL(hns_roce_db_unmap_user);
+
+static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir(
+					struct device *dma_device, gfp_t gfp)
+{
+	struct hns_roce_db_pgdir *pgdir;
+
+	pgdir = kzalloc(sizeof(*pgdir), gfp);
+	if (!pgdir)
+		return NULL;
+
+	bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2);
+	pgdir->bits[0] = pgdir->order0;
+	pgdir->bits[1] = pgdir->order1;
+	pgdir->db_page = dma_alloc_coherent(dma_device, PAGE_SIZE,
+					    &pgdir->db_dma, gfp);
+	if (!pgdir->db_page) {
+		kfree(pgdir);
+		return NULL;
+	}
+
+	return pgdir;
+}
+
+static int hns_roce_alloc_db_from_pgdir(struct hns_roce_db_pgdir *pgdir,
+					struct hns_roce_db *db, int order)
+{
+	int o;
+	int i;
+
+	for (o = order; o <= 1; ++o) {
+		i = find_first_bit(pgdir->bits[o], HNS_ROCE_DB_PER_PAGE >> o);
+		if (i < HNS_ROCE_DB_PER_PAGE >> o)
+			goto found;
+	}
+
+	return -ENOMEM;
+
+found:
+	clear_bit(i, pgdir->bits[o]);
+
+	i <<= o;
+
+	if (o > order)
+		set_bit(i ^ 1, pgdir->bits[order]);
+
+	db->u.pgdir	= pgdir;
+	db->index	= i;
+	db->db_record	= pgdir->db_page + db->index;
+	db->dma		= pgdir->db_dma  + db->index * 4;
+	db->order	= order;
+
+	return 0;
+}
+
+int hns_roce_alloc_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db,
+		      int order, gfp_t gfp)
+{
+	struct hns_roce_db_pgdir *pgdir;
+	int ret = 0;
+
+	mutex_lock(&hr_dev->pgdir_mutex);
+
+	list_for_each_entry(pgdir, &hr_dev->pgdir_list, list)
+		if (!hns_roce_alloc_db_from_pgdir(pgdir, db, order))
+			goto out;
+
+	pgdir = hns_roce_alloc_db_pgdir(hr_dev->dev, gfp);
+	if (!pgdir) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	list_add(&pgdir->list, &hr_dev->pgdir_list);
+
+	/* This should never fail -- we just allocated an empty page: */
+	WARN_ON(hns_roce_alloc_db_from_pgdir(pgdir, db, order));
+
+out:
+	mutex_unlock(&hr_dev->pgdir_mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(hns_roce_alloc_db);
+
+void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db)
+{
+	int o;
+	int i;
+
+	mutex_lock(&hr_dev->pgdir_mutex);
+
+	o = db->order;
+	i = db->index;
+
+	if (db->order == 0 && test_bit(i ^ 1, db->u.pgdir->order0)) {
+		clear_bit(i ^ 1, db->u.pgdir->order0);
+		++o;
+	}
+
+	i >>= o;
+	set_bit(i, db->u.pgdir->bits[o]);
+
+	if (bitmap_full(db->u.pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2)) {
+		dma_free_coherent(hr_dev->dev, PAGE_SIZE, db->u.pgdir->db_page,
+				  db->u.pgdir->db_dma);
+		list_del(&db->u.pgdir->list);
+		kfree(db->u.pgdir);
+	}
+
+	mutex_unlock(&hr_dev->pgdir_mutex);
+}
+EXPORT_SYMBOL_GPL(hns_roce_free_db);
diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
index 9ee6da6..dd48559 100644
--- a/drivers/infiniband/hw/hns/hns_roce_device.h
+++ b/drivers/infiniband/hw/hns/hns_roce_device.h
@@ -761,6 +761,8 @@ struct hns_roce_dev {
 	spinlock_t		bt_cmd_lock;
 	struct hns_roce_ib_iboe iboe;
 
+	struct list_head        pgdir_list;
+	struct mutex            pgdir_mutex;
 	int			irq[HNS_ROCE_MAX_IRQ_NUM];
 	u8 __iomem		*reg_base;
 	struct hns_roce_caps	caps;
@@ -970,6 +972,10 @@ int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
 			 struct hns_roce_db *db);
 void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
 			    struct hns_roce_db *db);
+int hns_roce_alloc_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db,
+		      int order, gfp_t gfp);
+void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db);
+
 void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
 void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
 void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index 07129d2..cb0e5ee 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -470,7 +470,6 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 	struct hns_roce_v2_wqe_data_seg *dseg;
 	struct hns_roce_rinl_sge *sge_list;
 	struct device *dev = hr_dev->dev;
-	struct hns_roce_v2_db rq_db;
 	unsigned long flags;
 	void *wqe = NULL;
 	int ret = 0;
@@ -536,17 +535,7 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 		/* Memory barrier */
 		wmb();
 
-		rq_db.byte_4 = 0;
-		rq_db.parameter = 0;
-
-		roce_set_field(rq_db.byte_4, V2_DB_BYTE_4_TAG_M,
-			       V2_DB_BYTE_4_TAG_S, hr_qp->qpn);
-		roce_set_field(rq_db.byte_4, V2_DB_BYTE_4_CMD_M,
-			       V2_DB_BYTE_4_CMD_S, HNS_ROCE_V2_RQ_DB);
-		roce_set_field(rq_db.parameter, V2_DB_PARAMETER_CONS_IDX_M,
-			       V2_DB_PARAMETER_CONS_IDX_S, hr_qp->rq.head);
-
-		hns_roce_write64_k((__be32 *)&rq_db, hr_qp->rq.db_reg_l);
+		*hr_qp->rdb.db_record = hr_qp->rq.head & 0xffff;
 	}
 	spin_unlock_irqrestore(&hr_qp->rq.lock, flags);
 
@@ -3443,6 +3432,8 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
 		kfree(hr_qp->sq.wrid);
 		kfree(hr_qp->rq.wrid);
 		hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf);
+		if (hr_qp->rq.wqe_cnt)
+			hns_roce_free_db(hr_dev, &hr_qp->rdb);
 	}
 
 	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) {
diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
index dd7d882..7f4dd22d 100644
--- a/drivers/infiniband/hw/hns/hns_roce_main.c
+++ b/drivers/infiniband/hw/hns/hns_roce_main.c
@@ -665,6 +665,11 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)
 	spin_lock_init(&hr_dev->sm_lock);
 	spin_lock_init(&hr_dev->bt_cmd_lock);
 
+	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
+		INIT_LIST_HEAD(&hr_dev->pgdir_list);
+		mutex_init(&hr_dev->pgdir_mutex);
+	}
+
 	ret = hns_roce_init_uar_table(hr_dev);
 	if (ret) {
 		dev_err(dev, "Failed to initialize uar table. aborting\n");
diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
index 300f760..4f7d2d1 100644
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -650,6 +650,17 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 		hr_qp->rq.db_reg_l = hr_dev->reg_base + hr_dev->odb_offset +
 				     DB_REG_OFFSET * hr_dev->priv_uar.index;
 
+		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
+		    hns_roce_qp_has_rq(init_attr)) {
+			ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0,
+						GFP_KERNEL);
+			if (ret) {
+				dev_err(dev, "rq record doorbell alloc failed!\n");
+				goto err_rq_sge_list;
+			}
+			*hr_qp->rdb.db_record = 0;
+		}
+
 		/* Allocate QP buf */
 		page_shift = PAGE_SHIFT + hr_dev->caps.mtt_buf_pg_sz;
 		if (hns_roce_buf_alloc(hr_dev, hr_qp->buff_size,
@@ -657,7 +668,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 				       &hr_qp->hr_buf, page_shift)) {
 			dev_err(dev, "hns_roce_buf_alloc error!\n");
 			ret = -ENOMEM;
-			goto err_rq_sge_list;
+			goto err_db;
 		}
 
 		hr_qp->mtt.mtt_type = MTT_TYPE_WQE;
@@ -747,6 +758,11 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
 	else
 		hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf);
 
+err_db:
+	if (!ib_pd->uobject && hns_roce_qp_has_rq(init_attr) &&
+	    (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
+		hns_roce_free_db(hr_dev, &hr_qp->rdb);
+
 err_rq_sge_list:
 	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE)
 		kfree(hr_qp->rq_inl_buf.wqe_list[0].sg_list);
-- 
1.9.1

--
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] 12+ messages in thread

* [PATCH for-next 4/4] RDMA/hns: Support cq record doorbell for kernel space
       [not found] ` <1516242871-154089-1-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
                     ` (2 preceding siblings ...)
  2018-01-18  2:34   ` [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space Yixian Liu
@ 2018-01-18  2:34   ` Yixian Liu
  3 siblings, 0 replies; 12+ messages in thread
From: Yixian Liu @ 2018-01-18  2:34 UTC (permalink / raw)
  To: leon-DgEjT+Ai2ygdnm+yROfE0A, jgg-uk2M96/98Pc
  Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA, linux-rdma-u79uwXL29TY76Z2rM5mHXA

This patch updates to support cq record doorbell for
the kernel space.

Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 drivers/infiniband/hw/hns/hns_roce_cq.c     | 18 +++++++++++++++++-
 drivers/infiniband/hw/hns/hns_roce_device.h |  1 +
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 19 +------------------
 3 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/infiniband/hw/hns/hns_roce_cq.c b/drivers/infiniband/hw/hns/hns_roce_cq.c
index 918960d..d1b7c75 100644
--- a/drivers/infiniband/hw/hns/hns_roce_cq.c
+++ b/drivers/infiniband/hw/hns/hns_roce_cq.c
@@ -366,12 +366,22 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 		/* Get user space parameters */
 		uar = &to_hr_ucontext(context)->uar;
 	} else {
+		if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
+			ret = hns_roce_alloc_db(hr_dev, &hr_cq->db, 1,
+						GFP_KERNEL);
+			if (ret)
+				goto err_cq;
+
+			hr_cq->set_ci_db = hr_cq->db.db_record;
+			*hr_cq->set_ci_db = 0;
+		}
+
 		/* Init mmt table and write buff address to mtt table */
 		ret = hns_roce_ib_alloc_cq_buf(hr_dev, &hr_cq->hr_buf,
 					       cq_entries);
 		if (ret) {
 			dev_err(dev, "Failed to alloc_cq_buf.\n");
-			goto err_cq;
+			goto err_db;
 		}
 
 		uar = &hr_dev->priv_uar;
@@ -426,6 +436,10 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 		hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf,
 					hr_cq->ib_cq.cqe);
 
+err_db:
+	if (!context && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
+		hns_roce_free_db(hr_dev, &hr_cq->db);
+
 err_cq:
 	kfree(hr_cq);
 	return ERR_PTR(ret);
@@ -455,6 +469,8 @@ int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq)
 			/* Free the buff of stored cq */
 			hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf,
 						ib_cq->cqe);
+			if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)
+				hns_roce_free_db(hr_dev, &hr_cq->db);
 		}
 
 		kfree(hr_cq);
diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
index dd48559..9869eb3 100644
--- a/drivers/infiniband/hw/hns/hns_roce_device.h
+++ b/drivers/infiniband/hw/hns/hns_roce_device.h
@@ -386,6 +386,7 @@ struct hns_roce_cq {
 	struct hns_roce_uar		*uar;
 	u32				cq_depth;
 	u32				cons_index;
+	u32				*set_ci_db;
 	void __iomem			*cq_db_l;
 	u16				*tptr_addr;
 	int				arm_sn;
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index cb0e5ee..32c8fee 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -1469,24 +1469,7 @@ static struct hns_roce_v2_cqe *next_cqe_sw_v2(struct hns_roce_cq *hr_cq)
 
 static void hns_roce_v2_cq_set_ci(struct hns_roce_cq *hr_cq, u32 cons_index)
 {
-	struct hns_roce_v2_cq_db cq_db;
-
-	cq_db.byte_4 = 0;
-	cq_db.parameter = 0;
-
-	roce_set_field(cq_db.byte_4, V2_CQ_DB_BYTE_4_TAG_M,
-		       V2_CQ_DB_BYTE_4_TAG_S, hr_cq->cqn);
-	roce_set_field(cq_db.byte_4, V2_CQ_DB_BYTE_4_CMD_M,
-		       V2_CQ_DB_BYTE_4_CMD_S, HNS_ROCE_V2_CQ_DB_PTR);
-
-	roce_set_field(cq_db.parameter, V2_CQ_DB_PARAMETER_CONS_IDX_M,
-		       V2_CQ_DB_PARAMETER_CONS_IDX_S,
-		       cons_index & ((hr_cq->cq_depth << 1) - 1));
-	roce_set_field(cq_db.parameter, V2_CQ_DB_PARAMETER_CMD_SN_M,
-		       V2_CQ_DB_PARAMETER_CMD_SN_S, 1);
-
-	hns_roce_write64_k((__be32 *)&cq_db, hr_cq->cq_db_l);
-
+	*hr_cq->set_ci_db = cons_index & 0xffffff;
 }
 
 static void __hns_roce_v2_cq_clean(struct hns_roce_cq *hr_cq, u32 qpn,
-- 
1.9.1

--
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] 12+ messages in thread

* Re: [PATCH for-next 1/4] RDMA/hns: Support rq record doorbell for the user space
       [not found]     ` <1516242871-154089-2-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2018-01-22  8:08       ` Leon Romanovsky
       [not found]         ` <20180122080852.GI1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Leon Romanovsky @ 2018-01-22  8:08 UTC (permalink / raw)
  To: Yixian Liu
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 12597 bytes --]

On Thu, Jan 18, 2018 at 10:34:28AM +0800, Yixian Liu wrote:
> This patch adds interfaces and definitions to support the rq record
> doorbell for the user space.
>
> Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> ---
>  drivers/infiniband/hw/hns/Makefile          |  2 +-
>  drivers/infiniband/hw/hns/hns_roce_db.c     | 94 +++++++++++++++++++++++++++++
>  drivers/infiniband/hw/hns/hns_roce_device.h | 41 ++++++++++++-
>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 22 ++++++-
>  drivers/infiniband/hw/hns/hns_roce_main.c   |  5 ++
>  drivers/infiniband/hw/hns/hns_roce_qp.c     | 32 +++++++++-
>  6 files changed, 191 insertions(+), 5 deletions(-)
>  create mode 100644 drivers/infiniband/hw/hns/hns_roce_db.c
>
> diff --git a/drivers/infiniband/hw/hns/Makefile b/drivers/infiniband/hw/hns/Makefile
> index 97bf2cd..cf03404 100644
> --- a/drivers/infiniband/hw/hns/Makefile
> +++ b/drivers/infiniband/hw/hns/Makefile
> @@ -7,7 +7,7 @@ ccflags-y :=  -Idrivers/net/ethernet/hisilicon/hns3
>  obj-$(CONFIG_INFINIBAND_HNS) += hns-roce.o
>  hns-roce-objs := hns_roce_main.o hns_roce_cmd.o hns_roce_pd.o \
>  	hns_roce_ah.o hns_roce_hem.o hns_roce_mr.o hns_roce_qp.o \
> -	hns_roce_cq.o hns_roce_alloc.o
> +	hns_roce_cq.o hns_roce_alloc.o hns_roce_db.o
>  obj-$(CONFIG_INFINIBAND_HNS_HIP06) += hns-roce-hw-v1.o
>  hns-roce-hw-v1-objs := hns_roce_hw_v1.o
>  obj-$(CONFIG_INFINIBAND_HNS_HIP08) += hns-roce-hw-v2.o
> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
> new file mode 100644
> index 0000000..0908208
> --- /dev/null
> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
> @@ -0,0 +1,94 @@
> +/*
> + * Copyright (c) 2017 Hisilicon Limited.
> + * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.

Good to know

> + *
> + * This software is available to you under a choice of one of two
> + * licenses.  You may choose to be licensed under the terms of the GNU
> + * General Public License (GPL) Version 2, available from the file
> + * COPYING in the main directory of this source tree, or the
> + * OpenIB.org BSD license below:
> + *
> + *     Redistribution and use in source and binary forms, with or
> + *     without modification, are permitted provided that the following
> + *     conditions are met:
> + *
> + *      - Redistributions of source code must retain the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer.
> + *
> + *      - Redistributions in binary form must reproduce the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer in the documentation and/or other materials
> + *        provided with the distribution.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + */

Please move to use SPDX headers for new files.

> +
> +#include <linux/platform_device.h>
> +#include <rdma/ib_umem.h>
> +#include "hns_roce_device.h"
> +
> +int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
> +			 struct hns_roce_db *db)
> +{
> +	struct hns_roce_user_db_page *db_page;
> +	int ret = 0;
> +
> +	mutex_lock(&context->db_page_mutex);
> +
> +	list_for_each_entry(db_page, &context->db_page_list, list)
> +		if (db_page->user_virt == (virt & PAGE_MASK))
> +			goto found;
> +
> +	db_page = kmalloc(sizeof(*db_page), GFP_KERNEL);
> +	if (!db_page) {
> +		ret = -ENOMEM;
> +		goto out;
> +	}
> +
> +	db_page->user_virt = (virt & PAGE_MASK);
> +	db_page->refcnt    = 0;
> +	db_page->umem      = ib_umem_get(&context->ibucontext, virt & PAGE_MASK,
> +					 PAGE_SIZE, 0, 0);
> +	if (IS_ERR(db_page->umem)) {
> +		ret = PTR_ERR(db_page->umem);
> +		kfree(db_page);
> +		goto out;
> +	}
> +
> +	list_add(&db_page->list, &context->db_page_list);
> +
> +found:
> +	db->dma = sg_dma_address(db_page->umem->sg_head.sgl) +
> +		  (virt & ~PAGE_MASK);
> +	db->u.user_page = db_page;
> +	++db_page->refcnt;
> +
> +out:
> +	mutex_unlock(&context->db_page_mutex);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL(hns_roce_db_map_user);
> +
> +void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
> +			    struct hns_roce_db *db)
> +{
> +	mutex_lock(&context->db_page_mutex);
> +
> +	if (!--db->u.user_page->refcnt) {
> +		list_del(&db->u.user_page->list);
> +		ib_umem_release(db->u.user_page->umem);
> +		kfree(db->u.user_page);
> +	}
> +
> +	mutex_unlock(&context->db_page_mutex);
> +}
> +EXPORT_SYMBOL(hns_roce_db_unmap_user);
> diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
> index 42c3b5a..65c09c5 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_device.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_device.h
> @@ -178,7 +178,8 @@ enum {
>  enum {
>  	HNS_ROCE_CAP_FLAG_REREG_MR		= BIT(0),
>  	HNS_ROCE_CAP_FLAG_ROCE_V1_V2		= BIT(1),
> -	HNS_ROCE_CAP_FLAG_RQ_INLINE		= BIT(2)
> +	HNS_ROCE_CAP_FLAG_RQ_INLINE		= BIT(2),
> +	HNS_ROCE_CAP_FLAG_RECORD_DB		= BIT(3)
>  };
>
>  enum hns_roce_mtt_type {
> @@ -186,6 +187,10 @@ enum hns_roce_mtt_type {
>  	MTT_TYPE_CQE,
>  };
>
> +enum {
> +	HNS_ROCE_DB_PER_PAGE = PAGE_SIZE / 4
> +};
> +
>  #define HNS_ROCE_CMD_SUCCESS			1
>
>  #define HNS_ROCE_PORT_DOWN			0
> @@ -203,6 +208,8 @@ struct hns_roce_uar {
>  struct hns_roce_ucontext {
>  	struct ib_ucontext	ibucontext;
>  	struct hns_roce_uar	uar;
> +	struct list_head	db_page_list;
> +	struct mutex		db_page_mutex;
>  };
>
>  struct hns_roce_pd {
> @@ -335,6 +342,33 @@ struct hns_roce_buf {
>  	int				page_shift;
>  };
>
> +struct hns_roce_db_pgdir {
> +	struct list_head	list;
> +	DECLARE_BITMAP(order0, HNS_ROCE_DB_PER_PAGE);
> +	DECLARE_BITMAP(order1, HNS_ROCE_DB_PER_PAGE / 2);
> +	unsigned long		*bits[2];

I didn't see any usage of the fields from this struct in this patch,
where did you use them?

> +	u32			*db_page;
> +	dma_addr_t		db_dma;
> +};
> +
> +struct hns_roce_user_db_page {
> +	struct list_head	list;
> +	struct ib_umem		*umem;
> +	unsigned long		user_virt;
> +	int			refcnt;

refcount_t please.

> +};
> +
> +struct hns_roce_db {
> +	u32		*db_record;
> +	union {
> +		struct hns_roce_db_pgdir *pgdir;
> +		struct hns_roce_user_db_page *user_page;
> +	} u;
> +	dma_addr_t	dma;
> +	int		index;
> +	int		order;
> +};
> +
>  struct hns_roce_cq_buf {
>  	struct hns_roce_buf hr_buf;
>  	struct hns_roce_mtt hr_mtt;
> @@ -465,6 +499,7 @@ struct hns_roce_rinl_buf {
>  struct hns_roce_qp {
>  	struct ib_qp		ibqp;
>  	struct hns_roce_buf	hr_buf;
> +	struct hns_roce_db	rdb;
>  	struct hns_roce_wq	rq;
>  	__le64			doorbell_qpn;
>  	__le32			sq_signal_bits;
> @@ -930,6 +965,10 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
>  int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq);
>  void hns_roce_free_cq(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq);
>
> +int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
> +			 struct hns_roce_db *db);
> +void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
> +			    struct hns_roce_db *db);
>  void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
>  void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
>  void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> index 256fe11..e0f4dc4 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> @@ -1140,7 +1140,8 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
>
>  	caps->flags		= HNS_ROCE_CAP_FLAG_REREG_MR |
>  				  HNS_ROCE_CAP_FLAG_ROCE_V1_V2 |
> -				  HNS_ROCE_CAP_FLAG_RQ_INLINE;
> +				  HNS_ROCE_CAP_FLAG_RQ_INLINE |
> +				  HNS_ROCE_CAP_FLAG_RECORD_DB;
>  	caps->pkey_table_len[0] = 1;
>  	caps->gid_table_len[0] = HNS_ROCE_V2_GID_INDEX_NUM;
>  	caps->ceqe_depth	= HNS_ROCE_V2_COMP_EQE_NUM;
> @@ -2246,6 +2247,19 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
>  		hr_qp->qkey = attr->qkey;
>  	}
>
> +	roce_set_bit(context->byte_68_rq_db, V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1);
> +	roce_set_bit(qpc_mask->byte_68_rq_db, V2_QPC_BYTE_68_RQ_RECORD_EN_S, 0);
> +
> +	roce_set_field(context->byte_68_rq_db,
> +		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M,
> +		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S,
> +		       ((u32)hr_qp->rdb.dma) >> 1);
> +	roce_set_field(qpc_mask->byte_68_rq_db,
> +		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M,
> +		       V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S, 0);
> +	context->rq_db_record_addr = hr_qp->rdb.dma >> 32;
> +	qpc_mask->rq_db_record_addr = 0;
> +
>  	roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 1);
>  	roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 0);
>
> @@ -3183,6 +3197,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
>  		hr_qp->sq.tail = 0;
>  		hr_qp->sq_next_wqe = 0;
>  		hr_qp->next_sge = 0;
> +		if (hr_qp->rq.wqe_cnt)
> +			*hr_qp->rdb.db_record = 0;
>  	}
>
>  out:
> @@ -3409,6 +3425,10 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
>  	hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt);
>
>  	if (is_user) {
> +		if (hr_qp->rq.wqe_cnt)
> +			hns_roce_db_unmap_user(
> +				to_hr_ucontext(hr_qp->ibqp.uobject->context),
> +				&hr_qp->rdb);
>  		ib_umem_release(hr_qp->umem);
>  	} else {
>  		kfree(hr_qp->sq.wrid);
> diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
> index aa0c242..dd7d882 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_main.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_main.c
> @@ -350,6 +350,11 @@ static struct ib_ucontext *hns_roce_alloc_ucontext(struct ib_device *ib_dev,
>  	if (ret)
>  		goto error_fail_uar_alloc;
>
> +	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
> +		INIT_LIST_HEAD(&context->db_page_list);
> +		mutex_init(&context->db_page_mutex);
> +	}
> +
>  	ret = ib_copy_to_udata(udata, &resp, sizeof(resp));
>  	if (ret)
>  		goto error_fail_copy_to_udata;
> diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
> index 4414cea..300f760 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_qp.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
> @@ -489,6 +489,15 @@ static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev,
>  	return 0;
>  }
>
> +static int hns_roce_qp_has_rq(struct ib_qp_init_attr *attr)
> +{
> +	if (attr->qp_type == IB_QPT_XRC_INI ||
> +	    attr->qp_type == IB_QPT_XRC_TGT || attr->srq)
> +		return 0;
> +
> +	return 1;
> +}
> +
>  static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>  				     struct ib_pd *ib_pd,
>  				     struct ib_qp_init_attr *init_attr,
> @@ -602,6 +611,17 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>  			dev_err(dev, "hns_roce_ib_umem_write_mtt error for create qp\n");
>  			goto err_mtt;
>  		}
> +
> +		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
> +		    hns_roce_qp_has_rq(init_attr)) {
> +			ret = hns_roce_db_map_user(
> +					to_hr_ucontext(ib_pd->uobject->context),
> +					ucmd.db_addr, &hr_qp->rdb);
> +			if (ret) {
> +				dev_err(dev, "rp record doorbell map failed!\n");
> +				goto err_mtt;
> +			}
> +		}
>  	} else {
>  		if (init_attr->create_flags &
>  		    IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) {
> @@ -707,8 +727,16 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>  		hns_roce_release_range_qp(hr_dev, qpn, 1);
>
>  err_wrid:
> -	kfree(hr_qp->sq.wrid);
> -	kfree(hr_qp->rq.wrid);
> +	if (ib_pd->uobject) {
> +		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
> +		    hns_roce_qp_has_rq(init_attr))
> +			hns_roce_db_unmap_user(
> +					to_hr_ucontext(ib_pd->uobject->context),
> +					&hr_qp->rdb);
> +	} else {
> +		kfree(hr_qp->sq.wrid);
> +		kfree(hr_qp->rq.wrid);
> +	}
>
>  err_mtt:
>  	hns_roce_mtt_cleanup(hr_dev, &hr_qp->mtt);
> --
> 1.9.1
>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH for-next 1/4] RDMA/hns: Support rq record doorbell for the user space
       [not found]         ` <20180122080852.GI1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
@ 2018-01-22 13:33           ` Liuyixian (Eason)
  0 siblings, 0 replies; 12+ messages in thread
From: Liuyixian (Eason) @ 2018-01-22 13:33 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA



On 2018/1/22 16:08, Leon Romanovsky wrote:
> On Thu, Jan 18, 2018 at 10:34:28AM +0800, Yixian Liu wrote:
>> This patch adds interfaces and definitions to support the rq record
>> doorbell for the user space.
<---cut--->
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
>> new file mode 100644
>> index 0000000..0908208
>> --- /dev/null
>> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
>> @@ -0,0 +1,94 @@
>> +/*
>> + * Copyright (c) 2017 Hisilicon Limited.
>> + * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.
> 
> Good to know
> 
>> + *
>> + * This software is available to you under a choice of one of two
>> + * licenses.  You may choose to be licensed under the terms of the GNU
>> + * General Public License (GPL) Version 2, available from the file
>> + * COPYING in the main directory of this source tree, or the
>> + * OpenIB.org BSD license below:
>> + *
>> + *     Redistribution and use in source and binary forms, with or
>> + *     without modification, are permitted provided that the following
>> + *     conditions are met:
>> + *
>> + *      - Redistributions of source code must retain the above
>> + *        copyright notice, this list of conditions and the following
>> + *        disclaimer.
>> + *
>> + *      - Redistributions in binary form must reproduce the above
>> + *        copyright notice, this list of conditions and the following
>> + *        disclaimer in the documentation and/or other materials
>> + *        provided with the distribution.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
>> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
>> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>> + * SOFTWARE.
>> + */
> 
> Please move to use SPDX headers for new files.
> 

Okay, I will add it in next version.

>> +
>> +#include <linux/platform_device.h>
>> +#include <rdma/ib_umem.h>
>> +#include "hns_roce_device.h"
<---cut--->
>>
>> +struct hns_roce_db_pgdir {
>> +	struct list_head	list;
>> +	DECLARE_BITMAP(order0, HNS_ROCE_DB_PER_PAGE);
>> +	DECLARE_BITMAP(order1, HNS_ROCE_DB_PER_PAGE / 2);
>> +	unsigned long		*bits[2];
> 
> I didn't see any usage of the fields from this struct in this patch,
> where did you use them?
> 

They are used in patch [3/4] for kernel space.

>> +	u32			*db_page;
>> +	dma_addr_t		db_dma;
>> +};
>> +
>> +struct hns_roce_user_db_page {
>> +	struct list_head	list;
>> +	struct ib_umem		*umem;
>> +	unsigned long		user_virt;
>> +	int			refcnt;
> 
> refcount_t please.
>

Thanks, will fix it.



--
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] 12+ messages in thread

* Re: [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space
       [not found]     ` <1516242871-154089-4-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2018-01-23 11:07       ` Leon Romanovsky
       [not found]         ` <20180123110740.GR1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Leon Romanovsky @ 2018-01-23 11:07 UTC (permalink / raw)
  To: Yixian Liu
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 9247 bytes --]

On Thu, Jan 18, 2018 at 10:34:30AM +0800, Yixian Liu wrote:
> This patch updates to support rq record doorbell for
> the kernel space.
>
> Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> ---
>  drivers/infiniband/hw/hns/hns_roce_db.c     | 112 ++++++++++++++++++++++++++++
>  drivers/infiniband/hw/hns/hns_roce_device.h |   6 ++
>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  15 +---
>  drivers/infiniband/hw/hns/hns_roce_main.c   |   5 ++
>  drivers/infiniband/hw/hns/hns_roce_qp.c     |  18 ++++-
>  5 files changed, 143 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
> index 0908208..de3fa94 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_db.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
> @@ -92,3 +92,115 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
>  	mutex_unlock(&context->db_page_mutex);
>  }
>  EXPORT_SYMBOL(hns_roce_db_unmap_user);
> +
> +static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir(
> +					struct device *dma_device, gfp_t gfp)
> +{
> +	struct hns_roce_db_pgdir *pgdir;
> +
> +	pgdir = kzalloc(sizeof(*pgdir), gfp);
> +	if (!pgdir)
> +		return NULL;
> +
> +	bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2);
> +	pgdir->bits[0] = pgdir->order0;

order0? isn't it equal to zero?

> +	pgdir->bits[1] = pgdir->order1;
> +	pgdir->db_page = dma_alloc_coherent(dma_device, PAGE_SIZE,
> +					    &pgdir->db_dma, gfp);
> +	if (!pgdir->db_page) {
> +		kfree(pgdir);
> +		return NULL;
> +	}
> +
> +	return pgdir;
> +}
> +
> +static int hns_roce_alloc_db_from_pgdir(struct hns_roce_db_pgdir *pgdir,
> +					struct hns_roce_db *db, int order)
> +{
> +	int o;
> +	int i;
> +
> +	for (o = order; o <= 1; ++o) {
> +		i = find_first_bit(pgdir->bits[o], HNS_ROCE_DB_PER_PAGE >> o);
> +		if (i < HNS_ROCE_DB_PER_PAGE >> o)
> +			goto found;
> +	}
> +
> +	return -ENOMEM;
> +
> +found:
> +	clear_bit(i, pgdir->bits[o]);
> +
> +	i <<= o;
> +
> +	if (o > order)
> +		set_bit(i ^ 1, pgdir->bits[order]);
> +
> +	db->u.pgdir	= pgdir;
> +	db->index	= i;
> +	db->db_record	= pgdir->db_page + db->index;
> +	db->dma		= pgdir->db_dma  + db->index * 4;
> +	db->order	= order;
> +
> +	return 0;
> +}
> +
> +int hns_roce_alloc_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db,
> +		      int order, gfp_t gfp)

I don't see any reason to provide "order" and "gfp" for one caller who has
hard-coded values.

> +{
> +	struct hns_roce_db_pgdir *pgdir;
> +	int ret = 0;
> +
> +	mutex_lock(&hr_dev->pgdir_mutex);
> +
> +	list_for_each_entry(pgdir, &hr_dev->pgdir_list, list)
> +		if (!hns_roce_alloc_db_from_pgdir(pgdir, db, order))
> +			goto out;
> +
> +	pgdir = hns_roce_alloc_db_pgdir(hr_dev->dev, gfp);
> +	if (!pgdir) {
> +		ret = -ENOMEM;
> +		goto out;
> +	}
> +
> +	list_add(&pgdir->list, &hr_dev->pgdir_list);
> +
> +	/* This should never fail -- we just allocated an empty page: */
> +	WARN_ON(hns_roce_alloc_db_from_pgdir(pgdir, db, order));
> +
> +out:
> +	mutex_unlock(&hr_dev->pgdir_mutex);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(hns_roce_alloc_db);
> +
> +void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db)
> +{
> +	int o;
> +	int i;
> +
> +	mutex_lock(&hr_dev->pgdir_mutex);
> +
> +	o = db->order;
> +	i = db->index;
> +
> +	if (db->order == 0 && test_bit(i ^ 1, db->u.pgdir->order0)) {
> +		clear_bit(i ^ 1, db->u.pgdir->order0);
> +		++o;
> +	}
> +
> +	i >>= o;
> +	set_bit(i, db->u.pgdir->bits[o]);
> +
> +	if (bitmap_full(db->u.pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2)) {
> +		dma_free_coherent(hr_dev->dev, PAGE_SIZE, db->u.pgdir->db_page,
> +				  db->u.pgdir->db_dma);
> +		list_del(&db->u.pgdir->list);
> +		kfree(db->u.pgdir);
> +	}
> +
> +	mutex_unlock(&hr_dev->pgdir_mutex);
> +}
> +EXPORT_SYMBOL_GPL(hns_roce_free_db);
> diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
> index 9ee6da6..dd48559 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_device.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_device.h
> @@ -761,6 +761,8 @@ struct hns_roce_dev {
>  	spinlock_t		bt_cmd_lock;
>  	struct hns_roce_ib_iboe iboe;
>
> +	struct list_head        pgdir_list;
> +	struct mutex            pgdir_mutex;
>  	int			irq[HNS_ROCE_MAX_IRQ_NUM];
>  	u8 __iomem		*reg_base;
>  	struct hns_roce_caps	caps;
> @@ -970,6 +972,10 @@ int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
>  			 struct hns_roce_db *db);
>  void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
>  			    struct hns_roce_db *db);
> +int hns_roce_alloc_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db,
> +		      int order, gfp_t gfp);
> +void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db);
> +
>  void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
>  void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
>  void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> index 07129d2..cb0e5ee 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> @@ -470,7 +470,6 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
>  	struct hns_roce_v2_wqe_data_seg *dseg;
>  	struct hns_roce_rinl_sge *sge_list;
>  	struct device *dev = hr_dev->dev;
> -	struct hns_roce_v2_db rq_db;
>  	unsigned long flags;
>  	void *wqe = NULL;
>  	int ret = 0;
> @@ -536,17 +535,7 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
>  		/* Memory barrier */
>  		wmb();
>
> -		rq_db.byte_4 = 0;
> -		rq_db.parameter = 0;
> -
> -		roce_set_field(rq_db.byte_4, V2_DB_BYTE_4_TAG_M,
> -			       V2_DB_BYTE_4_TAG_S, hr_qp->qpn);
> -		roce_set_field(rq_db.byte_4, V2_DB_BYTE_4_CMD_M,
> -			       V2_DB_BYTE_4_CMD_S, HNS_ROCE_V2_RQ_DB);
> -		roce_set_field(rq_db.parameter, V2_DB_PARAMETER_CONS_IDX_M,
> -			       V2_DB_PARAMETER_CONS_IDX_S, hr_qp->rq.head);
> -
> -		hns_roce_write64_k((__be32 *)&rq_db, hr_qp->rq.db_reg_l);
> +		*hr_qp->rdb.db_record = hr_qp->rq.head & 0xffff;
>  	}
>  	spin_unlock_irqrestore(&hr_qp->rq.lock, flags);
>
> @@ -3443,6 +3432,8 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
>  		kfree(hr_qp->sq.wrid);
>  		kfree(hr_qp->rq.wrid);
>  		hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf);
> +		if (hr_qp->rq.wqe_cnt)
> +			hns_roce_free_db(hr_dev, &hr_qp->rdb);
>  	}
>
>  	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) {
> diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
> index dd7d882..7f4dd22d 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_main.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_main.c
> @@ -665,6 +665,11 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)
>  	spin_lock_init(&hr_dev->sm_lock);
>  	spin_lock_init(&hr_dev->bt_cmd_lock);
>
> +	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
> +		INIT_LIST_HEAD(&hr_dev->pgdir_list);
> +		mutex_init(&hr_dev->pgdir_mutex);
> +	}
> +
>  	ret = hns_roce_init_uar_table(hr_dev);
>  	if (ret) {
>  		dev_err(dev, "Failed to initialize uar table. aborting\n");
> diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
> index 300f760..4f7d2d1 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_qp.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
> @@ -650,6 +650,17 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>  		hr_qp->rq.db_reg_l = hr_dev->reg_base + hr_dev->odb_offset +
>  				     DB_REG_OFFSET * hr_dev->priv_uar.index;
>
> +		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
> +		    hns_roce_qp_has_rq(init_attr)) {
> +			ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0,
> +						GFP_KERNEL);
> +			if (ret) {
> +				dev_err(dev, "rq record doorbell alloc failed!\n");
> +				goto err_rq_sge_list;
> +			}
> +			*hr_qp->rdb.db_record = 0;
> +		}
> +
>  		/* Allocate QP buf */
>  		page_shift = PAGE_SHIFT + hr_dev->caps.mtt_buf_pg_sz;
>  		if (hns_roce_buf_alloc(hr_dev, hr_qp->buff_size,
> @@ -657,7 +668,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>  				       &hr_qp->hr_buf, page_shift)) {
>  			dev_err(dev, "hns_roce_buf_alloc error!\n");
>  			ret = -ENOMEM;
> -			goto err_rq_sge_list;
> +			goto err_db;
>  		}
>
>  		hr_qp->mtt.mtt_type = MTT_TYPE_WQE;
> @@ -747,6 +758,11 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>  	else
>  		hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf);
>
> +err_db:
> +	if (!ib_pd->uobject && hns_roce_qp_has_rq(init_attr) &&
> +	    (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
> +		hns_roce_free_db(hr_dev, &hr_qp->rdb);
> +
>  err_rq_sge_list:
>  	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE)
>  		kfree(hr_qp->rq_inl_buf.wqe_list[0].sg_list);
> --
> 1.9.1
>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space
       [not found]         ` <20180123110740.GR1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
@ 2018-01-24 12:40           ` Liuyixian (Eason)
       [not found]             ` <c5cfd489-e589-1d01-ef7a-718d3dc6d4e5-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Liuyixian (Eason) @ 2018-01-24 12:40 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA



On 2018/1/23 19:07, Leon Romanovsky wrote:
> On Thu, Jan 18, 2018 at 10:34:30AM +0800, Yixian Liu wrote:
>> This patch updates to support rq record doorbell for
>> the kernel space.
>>
>> Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>> Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>> Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>> Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>> ---
>>  drivers/infiniband/hw/hns/hns_roce_db.c     | 112 ++++++++++++++++++++++++++++
>>  drivers/infiniband/hw/hns/hns_roce_device.h |   6 ++
>>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  15 +---
>>  drivers/infiniband/hw/hns/hns_roce_main.c   |   5 ++
>>  drivers/infiniband/hw/hns/hns_roce_qp.c     |  18 ++++-
>>  5 files changed, 143 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
>> index 0908208..de3fa94 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_db.c
>> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
>> @@ -92,3 +92,115 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
>>  	mutex_unlock(&context->db_page_mutex);
>>  }
>>  EXPORT_SYMBOL(hns_roce_db_unmap_user);
>> +
>> +static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir(
>> +					struct device *dma_device, gfp_t gfp)
>> +{
>> +	struct hns_roce_db_pgdir *pgdir;
>> +
>> +	pgdir = kzalloc(sizeof(*pgdir), gfp);
>> +	if (!pgdir)
>> +		return NULL;
>> +
>> +	bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2);
>> +	pgdir->bits[0] = pgdir->order0;
> 
> order0? isn't it equal to zero?
> 

No. Here order0 is the name of a bitmap array and bits[0] points to it.

>> +	pgdir->bits[1] = pgdir->order1;
>> +	pgdir->db_page = dma_alloc_coherent(dma_device, PAGE_SIZE,
>> +					    &pgdir->db_dma, gfp);
>> +	if (!pgdir->db_page) {
>> +		kfree(pgdir);
>> +		return NULL;
>> +	}
>> +
>> +	return pgdir;
>> +}
>> +
>> +static int hns_roce_alloc_db_from_pgdir(struct hns_roce_db_pgdir *pgdir,
>> +					struct hns_roce_db *db, int order)
>> +{
>> +	int o;
>> +	int i;
>> +
>> +	for (o = order; o <= 1; ++o) {
>> +		i = find_first_bit(pgdir->bits[o], HNS_ROCE_DB_PER_PAGE >> o);
>> +		if (i < HNS_ROCE_DB_PER_PAGE >> o)
>> +			goto found;
>> +	}
>> +
>> +	return -ENOMEM;
>> +
>> +found:
>> +	clear_bit(i, pgdir->bits[o]);
>> +
>> +	i <<= o;
>> +
>> +	if (o > order)
>> +		set_bit(i ^ 1, pgdir->bits[order]);
>> +
>> +	db->u.pgdir	= pgdir;
>> +	db->index	= i;
>> +	db->db_record	= pgdir->db_page + db->index;
>> +	db->dma		= pgdir->db_dma  + db->index * 4;
>> +	db->order	= order;
>> +
>> +	return 0;
>> +}
>> +
>> +int hns_roce_alloc_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db,
>> +		      int order, gfp_t gfp)
> 
> I don't see any reason to provide "order" and "gfp" for one caller who has
> hard-coded values.
> 

You are right. Will fix it next version.

>> +{
>> +	struct hns_roce_db_pgdir *pgdir;
>> +	int ret = 0;
>> +
>> +	mutex_lock(&hr_dev->pgdir_mutex);
>> +
>> +	list_for_each_entry(pgdir, &hr_dev->pgdir_list, list)
>> +		if (!hns_roce_alloc_db_from_pgdir(pgdir, db, order))
>> +			goto out;
>> +
>> +	pgdir = hns_roce_alloc_db_pgdir(hr_dev->dev, gfp);
>> +	if (!pgdir) {
>> +		ret = -ENOMEM;
>> +		goto out;
>> +	}
>> +
>> +	list_add(&pgdir->list, &hr_dev->pgdir_list);
>> +
>> +	/* This should never fail -- we just allocated an empty page: */
>> +	WARN_ON(hns_roce_alloc_db_from_pgdir(pgdir, db, order));
>> +
>> +out:
>> +	mutex_unlock(&hr_dev->pgdir_mutex);
>> +
>> +	return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(hns_roce_alloc_db);
>> +
>> +void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db)
>> +{
>> +	int o;
>> +	int i;
>> +
>> +	mutex_lock(&hr_dev->pgdir_mutex);
>> +
>> +	o = db->order;
>> +	i = db->index;
>> +
>> +	if (db->order == 0 && test_bit(i ^ 1, db->u.pgdir->order0)) {
>> +		clear_bit(i ^ 1, db->u.pgdir->order0);
>> +		++o;
>> +	}
>> +
>> +	i >>= o;
>> +	set_bit(i, db->u.pgdir->bits[o]);
>> +
>> +	if (bitmap_full(db->u.pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2)) {
>> +		dma_free_coherent(hr_dev->dev, PAGE_SIZE, db->u.pgdir->db_page,
>> +				  db->u.pgdir->db_dma);
>> +		list_del(&db->u.pgdir->list);
>> +		kfree(db->u.pgdir);
>> +	}
>> +
>> +	mutex_unlock(&hr_dev->pgdir_mutex);
>> +}
>> +EXPORT_SYMBOL_GPL(hns_roce_free_db);
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
>> index 9ee6da6..dd48559 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_device.h
>> +++ b/drivers/infiniband/hw/hns/hns_roce_device.h
>> @@ -761,6 +761,8 @@ struct hns_roce_dev {
>>  	spinlock_t		bt_cmd_lock;
>>  	struct hns_roce_ib_iboe iboe;
>>
>> +	struct list_head        pgdir_list;
>> +	struct mutex            pgdir_mutex;
>>  	int			irq[HNS_ROCE_MAX_IRQ_NUM];
>>  	u8 __iomem		*reg_base;
>>  	struct hns_roce_caps	caps;
>> @@ -970,6 +972,10 @@ int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
>>  			 struct hns_roce_db *db);
>>  void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
>>  			    struct hns_roce_db *db);
>> +int hns_roce_alloc_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db,
>> +		      int order, gfp_t gfp);
>> +void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db);
>> +
>>  void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
>>  void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
>>  void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
>> index 07129d2..cb0e5ee 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
>> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
>> @@ -470,7 +470,6 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
>>  	struct hns_roce_v2_wqe_data_seg *dseg;
>>  	struct hns_roce_rinl_sge *sge_list;
>>  	struct device *dev = hr_dev->dev;
>> -	struct hns_roce_v2_db rq_db;
>>  	unsigned long flags;
>>  	void *wqe = NULL;
>>  	int ret = 0;
>> @@ -536,17 +535,7 @@ static int hns_roce_v2_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
>>  		/* Memory barrier */
>>  		wmb();
>>
>> -		rq_db.byte_4 = 0;
>> -		rq_db.parameter = 0;
>> -
>> -		roce_set_field(rq_db.byte_4, V2_DB_BYTE_4_TAG_M,
>> -			       V2_DB_BYTE_4_TAG_S, hr_qp->qpn);
>> -		roce_set_field(rq_db.byte_4, V2_DB_BYTE_4_CMD_M,
>> -			       V2_DB_BYTE_4_CMD_S, HNS_ROCE_V2_RQ_DB);
>> -		roce_set_field(rq_db.parameter, V2_DB_PARAMETER_CONS_IDX_M,
>> -			       V2_DB_PARAMETER_CONS_IDX_S, hr_qp->rq.head);
>> -
>> -		hns_roce_write64_k((__be32 *)&rq_db, hr_qp->rq.db_reg_l);
>> +		*hr_qp->rdb.db_record = hr_qp->rq.head & 0xffff;
>>  	}
>>  	spin_unlock_irqrestore(&hr_qp->rq.lock, flags);
>>
>> @@ -3443,6 +3432,8 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
>>  		kfree(hr_qp->sq.wrid);
>>  		kfree(hr_qp->rq.wrid);
>>  		hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf);
>> +		if (hr_qp->rq.wqe_cnt)
>> +			hns_roce_free_db(hr_dev, &hr_qp->rdb);
>>  	}
>>
>>  	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) {
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
>> index dd7d882..7f4dd22d 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_main.c
>> +++ b/drivers/infiniband/hw/hns/hns_roce_main.c
>> @@ -665,6 +665,11 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev)
>>  	spin_lock_init(&hr_dev->sm_lock);
>>  	spin_lock_init(&hr_dev->bt_cmd_lock);
>>
>> +	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) {
>> +		INIT_LIST_HEAD(&hr_dev->pgdir_list);
>> +		mutex_init(&hr_dev->pgdir_mutex);
>> +	}
>> +
>>  	ret = hns_roce_init_uar_table(hr_dev);
>>  	if (ret) {
>>  		dev_err(dev, "Failed to initialize uar table. aborting\n");
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
>> index 300f760..4f7d2d1 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_qp.c
>> +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
>> @@ -650,6 +650,17 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>>  		hr_qp->rq.db_reg_l = hr_dev->reg_base + hr_dev->odb_offset +
>>  				     DB_REG_OFFSET * hr_dev->priv_uar.index;
>>
>> +		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
>> +		    hns_roce_qp_has_rq(init_attr)) {
>> +			ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0,
>> +						GFP_KERNEL);
>> +			if (ret) {
>> +				dev_err(dev, "rq record doorbell alloc failed!\n");
>> +				goto err_rq_sge_list;
>> +			}
>> +			*hr_qp->rdb.db_record = 0;
>> +		}
>> +
>>  		/* Allocate QP buf */
>>  		page_shift = PAGE_SHIFT + hr_dev->caps.mtt_buf_pg_sz;
>>  		if (hns_roce_buf_alloc(hr_dev, hr_qp->buff_size,
>> @@ -657,7 +668,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>>  				       &hr_qp->hr_buf, page_shift)) {
>>  			dev_err(dev, "hns_roce_buf_alloc error!\n");
>>  			ret = -ENOMEM;
>> -			goto err_rq_sge_list;
>> +			goto err_db;
>>  		}
>>
>>  		hr_qp->mtt.mtt_type = MTT_TYPE_WQE;
>> @@ -747,6 +758,11 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
>>  	else
>>  		hns_roce_buf_free(hr_dev, hr_qp->buff_size, &hr_qp->hr_buf);
>>
>> +err_db:
>> +	if (!ib_pd->uobject && hns_roce_qp_has_rq(init_attr) &&
>> +	    (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB))
>> +		hns_roce_free_db(hr_dev, &hr_qp->rdb);
>> +
>>  err_rq_sge_list:
>>  	if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE)
>>  		kfree(hr_qp->rq_inl_buf.wqe_list[0].sg_list);
>> --
>> 1.9.1
>>

--
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] 12+ messages in thread

* Re: [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space
       [not found]             ` <c5cfd489-e589-1d01-ef7a-718d3dc6d4e5-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2018-01-24 13:21               ` Leon Romanovsky
       [not found]                 ` <20180124132139.GK1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Leon Romanovsky @ 2018-01-24 13:21 UTC (permalink / raw)
  To: Liuyixian (Eason)
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 2065 bytes --]

On Wed, Jan 24, 2018 at 08:40:42PM +0800, Liuyixian (Eason) wrote:
>
>
> On 2018/1/23 19:07, Leon Romanovsky wrote:
> > On Thu, Jan 18, 2018 at 10:34:30AM +0800, Yixian Liu wrote:
> >> This patch updates to support rq record doorbell for
> >> the kernel space.
> >>
> >> Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >> Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >> Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >> Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >> ---
> >>  drivers/infiniband/hw/hns/hns_roce_db.c     | 112 ++++++++++++++++++++++++++++
> >>  drivers/infiniband/hw/hns/hns_roce_device.h |   6 ++
> >>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  15 +---
> >>  drivers/infiniband/hw/hns/hns_roce_main.c   |   5 ++
> >>  drivers/infiniband/hw/hns/hns_roce_qp.c     |  18 ++++-
> >>  5 files changed, 143 insertions(+), 13 deletions(-)
> >>
> >> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
> >> index 0908208..de3fa94 100644
> >> --- a/drivers/infiniband/hw/hns/hns_roce_db.c
> >> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
> >> @@ -92,3 +92,115 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
> >>  	mutex_unlock(&context->db_page_mutex);
> >>  }
> >>  EXPORT_SYMBOL(hns_roce_db_unmap_user);
> >> +
> >> +static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir(
> >> +					struct device *dma_device, gfp_t gfp)
> >> +{
> >> +	struct hns_roce_db_pgdir *pgdir;
> >> +
> >> +	pgdir = kzalloc(sizeof(*pgdir), gfp);
> >> +	if (!pgdir)
> >> +		return NULL;
> >> +
> >> +	bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2);
> >> +	pgdir->bits[0] = pgdir->order0;
> >
> > order0? isn't it equal to zero?
> >
>
> No. Here order0 is the name of a bitmap array and bits[0] points to it.

pgdir was allocated with kzalloc() -> all fields are zero ->
pgdir->order0 == 0 or pgdir->order0 == NULL -> What is the point in such
assignment?

Thanks

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space
       [not found]                 ` <20180124132139.GK1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
@ 2018-01-25 12:57                   ` Liuyixian (Eason)
       [not found]                     ` <443225ea-5a6a-5d7f-8136-b061e087f271-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Liuyixian (Eason) @ 2018-01-25 12:57 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA



On 2018/1/24 21:21, Leon Romanovsky wrote:
> On Wed, Jan 24, 2018 at 08:40:42PM +0800, Liuyixian (Eason) wrote:
>>
>>
>> On 2018/1/23 19:07, Leon Romanovsky wrote:
>>> On Thu, Jan 18, 2018 at 10:34:30AM +0800, Yixian Liu wrote:
>>>> This patch updates to support rq record doorbell for
>>>> the kernel space.
>>>>
>>>> Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>>>> Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>>>> Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>>>> Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>>>> ---
>>>>  drivers/infiniband/hw/hns/hns_roce_db.c     | 112 ++++++++++++++++++++++++++++
>>>>  drivers/infiniband/hw/hns/hns_roce_device.h |   6 ++
>>>>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  15 +---
>>>>  drivers/infiniband/hw/hns/hns_roce_main.c   |   5 ++
>>>>  drivers/infiniband/hw/hns/hns_roce_qp.c     |  18 ++++-
>>>>  5 files changed, 143 insertions(+), 13 deletions(-)
>>>>
>>>> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
>>>> index 0908208..de3fa94 100644
>>>> --- a/drivers/infiniband/hw/hns/hns_roce_db.c
>>>> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
>>>> @@ -92,3 +92,115 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
>>>>  	mutex_unlock(&context->db_page_mutex);
>>>>  }
>>>>  EXPORT_SYMBOL(hns_roce_db_unmap_user);
>>>> +
>>>> +static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir(
>>>> +					struct device *dma_device, gfp_t gfp)
>>>> +{
>>>> +	struct hns_roce_db_pgdir *pgdir;
>>>> +
>>>> +	pgdir = kzalloc(sizeof(*pgdir), gfp);
>>>> +	if (!pgdir)
>>>> +		return NULL;
>>>> +
>>>> +	bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2);
>>>> +	pgdir->bits[0] = pgdir->order0;
>>>
>>> order0? isn't it equal to zero?
>>>
>>
>> No. Here order0 is the name of a bitmap array and bits[0] points to it.
> 
> pgdir was allocated with kzalloc() -> all fields are zero ->
> pgdir->order0 == 0 or pgdir->order0 == NULL -> What is the point in such
> assignment?

The definition of hns_roce_db_pgdir is in patch [1/4] as following:

	struct hns_roce_db_pgdir {
		struct list_head	list;
		DECLARE_BITMAP(order0, HNS_ROCE_DB_PER_PAGE);
		DECLARE_BITMAP(order1, HNS_ROCE_DB_PER_PAGE / 2);
		unsigned long		*bits[2];
		u32			*db_page;
		dma_addr_t		db_dma;
	};

and,

	#define DECLARE_BITMAP(name,bits) \
		unsigned long name[BITS_TO_LONGS(bits)]

Therefore, pgdir->order0 is the base address of an array, not NULL.

Thanks.

--
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] 12+ messages in thread

* Re: [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space
       [not found]                     ` <443225ea-5a6a-5d7f-8136-b061e087f271-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2018-01-29 11:29                       ` Leon Romanovsky
  0 siblings, 0 replies; 12+ messages in thread
From: Leon Romanovsky @ 2018-01-29 11:29 UTC (permalink / raw)
  To: Liuyixian (Eason)
  Cc: jgg-uk2M96/98Pc, dledford-H+wXaHxf7aLQT0dZR+AlfA,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 3022 bytes --]

On Thu, Jan 25, 2018 at 08:57:36PM +0800, Liuyixian (Eason) wrote:
>
>
> On 2018/1/24 21:21, Leon Romanovsky wrote:
> > On Wed, Jan 24, 2018 at 08:40:42PM +0800, Liuyixian (Eason) wrote:
> >>
> >>
> >> On 2018/1/23 19:07, Leon Romanovsky wrote:
> >>> On Thu, Jan 18, 2018 at 10:34:30AM +0800, Yixian Liu wrote:
> >>>> This patch updates to support rq record doorbell for
> >>>> the kernel space.
> >>>>
> >>>> Signed-off-by: Yixian Liu <liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >>>> Signed-off-by: Lijun Ou <oulijun-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >>>> Signed-off-by: Wei Hu (Xavier) <xavier.huwei-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >>>> Signed-off-by: Shaobo Xu <xushaobo2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> >>>> ---
> >>>>  drivers/infiniband/hw/hns/hns_roce_db.c     | 112 ++++++++++++++++++++++++++++
> >>>>  drivers/infiniband/hw/hns/hns_roce_device.h |   6 ++
> >>>>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  |  15 +---
> >>>>  drivers/infiniband/hw/hns/hns_roce_main.c   |   5 ++
> >>>>  drivers/infiniband/hw/hns/hns_roce_qp.c     |  18 ++++-
> >>>>  5 files changed, 143 insertions(+), 13 deletions(-)
> >>>>
> >>>> diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c
> >>>> index 0908208..de3fa94 100644
> >>>> --- a/drivers/infiniband/hw/hns/hns_roce_db.c
> >>>> +++ b/drivers/infiniband/hw/hns/hns_roce_db.c
> >>>> @@ -92,3 +92,115 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
> >>>>  	mutex_unlock(&context->db_page_mutex);
> >>>>  }
> >>>>  EXPORT_SYMBOL(hns_roce_db_unmap_user);
> >>>> +
> >>>> +static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir(
> >>>> +					struct device *dma_device, gfp_t gfp)
> >>>> +{
> >>>> +	struct hns_roce_db_pgdir *pgdir;
> >>>> +
> >>>> +	pgdir = kzalloc(sizeof(*pgdir), gfp);
> >>>> +	if (!pgdir)
> >>>> +		return NULL;
> >>>> +
> >>>> +	bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2);
> >>>> +	pgdir->bits[0] = pgdir->order0;
> >>>
> >>> order0? isn't it equal to zero?
> >>>
> >>
> >> No. Here order0 is the name of a bitmap array and bits[0] points to it.
> >
> > pgdir was allocated with kzalloc() -> all fields are zero ->
> > pgdir->order0 == 0 or pgdir->order0 == NULL -> What is the point in such
> > assignment?
>
> The definition of hns_roce_db_pgdir is in patch [1/4] as following:
>
> 	struct hns_roce_db_pgdir {
> 		struct list_head	list;
> 		DECLARE_BITMAP(order0, HNS_ROCE_DB_PER_PAGE);
> 		DECLARE_BITMAP(order1, HNS_ROCE_DB_PER_PAGE / 2);
> 		unsigned long		*bits[2];
> 		u32			*db_page;
> 		dma_addr_t		db_dma;
> 	};
>
> and,
>
> 	#define DECLARE_BITMAP(name,bits) \
> 		unsigned long name[BITS_TO_LONGS(bits)]
>
> Therefore, pgdir->order0 is the base address of an array, not NULL.

Right, thanks.

>
> Thanks.
>
> --
> 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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

end of thread, other threads:[~2018-01-29 11:29 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-18  2:34 [PATCH for-next 0/4] Support rq record doorbell and cq record doorbell Yixian Liu
     [not found] ` <1516242871-154089-1-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-01-18  2:34   ` [PATCH for-next 1/4] RDMA/hns: Support rq record doorbell for the user space Yixian Liu
     [not found]     ` <1516242871-154089-2-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-01-22  8:08       ` Leon Romanovsky
     [not found]         ` <20180122080852.GI1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2018-01-22 13:33           ` Liuyixian (Eason)
2018-01-18  2:34   ` [PATCH for-next 2/4] RDMA/hns: Support cq " Yixian Liu
2018-01-18  2:34   ` [PATCH for-next 3/4] RDMA/hns: Support rq record doorbell for kernel space Yixian Liu
     [not found]     ` <1516242871-154089-4-git-send-email-liuyixian-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-01-23 11:07       ` Leon Romanovsky
     [not found]         ` <20180123110740.GR1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2018-01-24 12:40           ` Liuyixian (Eason)
     [not found]             ` <c5cfd489-e589-1d01-ef7a-718d3dc6d4e5-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-01-24 13:21               ` Leon Romanovsky
     [not found]                 ` <20180124132139.GK1393-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2018-01-25 12:57                   ` Liuyixian (Eason)
     [not found]                     ` <443225ea-5a6a-5d7f-8136-b061e087f271-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-01-29 11:29                       ` Leon Romanovsky
2018-01-18  2:34   ` [PATCH for-next 4/4] RDMA/hns: Support cq " Yixian Liu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.