Blob Blame History Raw
From: Yixian Liu <liuyixian@huawei.com>
Date: Thu, 15 Mar 2018 15:23:14 +0800
Subject: RDMA/hns: Fix cqn type and init resp
Patch-mainline: v4.17-rc1
Git-commit: 7b48221cf41a90cf4bfc36e6d699b7fa4169c970
References: bsc#1104427 FATE#326416

This patch changes the type of cqn from u32 to u64 to keep
userspace and kernel consistent, initializes resp both for
cq and qp to zeros, and also changes the condition judgment
of outlen considering future caps extension.

Suggested-by: Jason Gunthorpe <jgg@mellanox.com>
Fixes: e088a685eae9 (hns: Support rq record doorbell for the user space)
Fixes: 9b44703d0a21 (hns: Support cq record doorbell for the user space)
Signed-off-by: Yixian Liu <liuyixian@huawei.com>
Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Shaobo Xu <xushaobo2@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/infiniband/hw/hns/hns_roce_cq.c |   15 +++++++--------
 drivers/infiniband/hw/hns/hns_roce_qp.c |    8 ++++----
 include/uapi/rdma/hns-abi.h             |    3 +--
 3 files changed, 12 insertions(+), 14 deletions(-)

--- a/drivers/infiniband/hw/hns/hns_roce_cq.c
+++ b/drivers/infiniband/hw/hns/hns_roce_cq.c
@@ -315,7 +315,7 @@ struct ib_cq *hns_roce_ib_create_cq(stru
 	struct hns_roce_dev *hr_dev = to_hr_dev(ib_dev);
 	struct device *dev = hr_dev->dev;
 	struct hns_roce_ib_create_cq ucmd;
-	struct hns_roce_ib_create_cq_resp resp;
+	struct hns_roce_ib_create_cq_resp resp = {};
 	struct hns_roce_cq *hr_cq = NULL;
 	struct hns_roce_uar *uar = NULL;
 	int vector = attr->comp_vector;
@@ -389,7 +389,7 @@ struct ib_cq *hns_roce_ib_create_cq(stru
 	}
 
 	if (context && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
-	    (udata->outlen == sizeof(resp))) {
+	    (udata->outlen >= sizeof(resp))) {
 		ret = hns_roce_db_map_user(to_hr_ucontext(context),
 					   ucmd.db_addr, &hr_cq->db);
 		if (ret) {
@@ -413,15 +413,14 @@ struct ib_cq *hns_roce_ib_create_cq(stru
 	hr_cq->cq_depth = cq_entries;
 
 	if (context) {
+		resp.cqn = hr_cq->cqn;
 		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
-					(udata->outlen == sizeof(resp))) {
+					(udata->outlen >= sizeof(resp))) {
 			hr_cq->db_en = 1;
-			resp.cqn = hr_cq->cqn;
 			resp.cap_flags |= HNS_ROCE_SUPPORT_CQ_RECORD_DB;
-			ret = ib_copy_to_udata(udata, &resp, sizeof(resp));
-		} else
-			ret = ib_copy_to_udata(udata, &hr_cq->cqn, sizeof(u64));
+		}
 
+		ret = ib_copy_to_udata(udata, &resp, sizeof(resp));
 		if (ret)
 			goto err_dbmap;
 	}
@@ -430,7 +429,7 @@ struct ib_cq *hns_roce_ib_create_cq(stru
 
 err_dbmap:
 	if (context && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
-	    (udata->outlen == sizeof(resp)))
+	    (udata->outlen >= sizeof(resp)))
 		hns_roce_db_unmap_user(to_hr_ucontext(context),
 				       &hr_cq->db);
 
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -506,7 +506,7 @@ static int hns_roce_create_qp_common(str
 {
 	struct device *dev = hr_dev->dev;
 	struct hns_roce_ib_create_qp ucmd;
-	struct hns_roce_ib_create_qp_resp resp;
+	struct hns_roce_ib_create_qp_resp resp = {};
 	unsigned long qpn = 0;
 	int ret = 0;
 	u32 page_shift;
@@ -614,7 +614,7 @@ static int hns_roce_create_qp_common(str
 		}
 
 		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
-		    (udata->outlen == sizeof(resp)) &&
+		    (udata->outlen >= sizeof(resp)) &&
 		    hns_roce_qp_has_rq(init_attr)) {
 			ret = hns_roce_db_map_user(
 					to_hr_ucontext(ib_pd->uobject->context),
@@ -730,7 +730,7 @@ static int hns_roce_create_qp_common(str
 	else
 		hr_qp->doorbell_qpn = cpu_to_le64(hr_qp->qpn);
 
-	if (ib_pd->uobject && (udata->outlen == sizeof(resp)) &&
+	if (ib_pd->uobject && (udata->outlen >= sizeof(resp)) &&
 		(hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)) {
 
 		/* indicate kernel supports record db */
@@ -759,7 +759,7 @@ err_qpn:
 err_wrid:
 	if (ib_pd->uobject) {
 		if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) &&
-		    (udata->outlen == sizeof(resp)) &&
+		    (udata->outlen >= sizeof(resp)) &&
 		    hns_roce_qp_has_rq(init_attr))
 			hns_roce_db_unmap_user(
 					to_hr_ucontext(ib_pd->uobject->context),
--- a/include/uapi/rdma/hns-abi.h
+++ b/include/uapi/rdma/hns-abi.h
@@ -41,8 +41,7 @@ struct hns_roce_ib_create_cq {
 };
 
 struct hns_roce_ib_create_cq_resp {
-	__u32	cqn;
-	__u32	reserved;
+	__u64	cqn; /* Only 32 bits used, 64 for compat */
 	__u64	cap_flags;
 };