[PATCH rdma-next v1 16/16] RDMA/restrack: Add restrack wrappers to set/get ID and type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Leon Romanovsky <leonro@xxxxxxxxxxxx>

Avoid direct access to internal restrack values by providing
special wrappers and update previous occurrence for
rdma_res_to_id(), which translated from restrack entry to CM_ID
and not to restrack ID.

Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
---
 drivers/infiniband/core/cma.c                 |  8 +++----
 drivers/infiniband/core/core_priv.h           |  2 +-
 drivers/infiniband/core/restrack.c            | 24 +++++++++++++++++++
 drivers/infiniband/core/uverbs_cmd.c          |  8 +++----
 drivers/infiniband/core/uverbs_std_types_cq.c |  2 +-
 drivers/infiniband/core/verbs.c               |  6 ++---
 drivers/infiniband/hw/cxgb4/restrack.c        |  2 +-
 include/rdma/rdma_cm.h                        |  2 +-
 include/rdma/restrack.h                       | 22 +++++++++++++++++
 9 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 81bded0d37d1..b627a3357463 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -162,17 +162,17 @@ struct iw_cm_id *rdma_iw_cm_id(struct rdma_cm_id *id)
 EXPORT_SYMBOL(rdma_iw_cm_id);
 
 /**
- * rdma_res_to_id() - return the rdma_cm_id pointer for this restrack.
+ * rdma_res_to_cmid() - return the rdma_cm_id pointer for this restrack.
  * @res: rdma resource tracking entry pointer
  */
-struct rdma_cm_id *rdma_res_to_id(struct rdma_restrack_entry *res)
+struct rdma_cm_id *rdma_res_to_cmid(struct rdma_restrack_entry *res)
 {
 	struct rdma_id_private *id_priv =
 		container_of(res, struct rdma_id_private, res);
 
 	return &id_priv->id;
 }
-EXPORT_SYMBOL(rdma_res_to_id);
+EXPORT_SYMBOL(rdma_res_to_cmid);
 
 static void cma_add_one(struct ib_device *device);
 static void cma_remove_one(struct ib_device *device, void *client_data);
@@ -881,7 +881,7 @@ struct rdma_cm_id *__rdma_create_id(struct net *net,
 		return ERR_PTR(-ENOMEM);
 
 	rdma_restrack_set_task(&id_priv->res, caller);
-	id_priv->res.type = RDMA_RESTRACK_CM_ID;
+	rdma_rt_set_type(&id_priv->res, RDMA_RESTRACK_CM_ID);
 	id_priv->state = RDMA_CM_IDLE;
 	id_priv->id.context = context;
 	id_priv->id.event_handler = event_handler;
diff --git a/drivers/infiniband/core/core_priv.h b/drivers/infiniband/core/core_priv.h
index aca75c74e451..a3d14cb1f9d1 100644
--- a/drivers/infiniband/core/core_priv.h
+++ b/drivers/infiniband/core/core_priv.h
@@ -293,8 +293,8 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
 	 * and more importantly they are created internaly by driver,
 	 * see mlx5 create_dev_resources() as an example.
 	 */
+	rdma_rt_set_type(&qp->res, RDMA_RESTRACK_QP);
 	if (attr->qp_type < IB_QPT_XRC_INI) {
-		qp->res.type = RDMA_RESTRACK_QP;
 		if (uobj)
 			rdma_restrack_uadd(&qp->res);
 		else
diff --git a/drivers/infiniband/core/restrack.c b/drivers/infiniband/core/restrack.c
index 2e56f7e37132..95c4aed42219 100644
--- a/drivers/infiniband/core/restrack.c
+++ b/drivers/infiniband/core/restrack.c
@@ -499,3 +499,27 @@ void rdma_rt_set_id_range(struct ib_device *dev, enum rdma_restrack_type type,
 	rt[type].next_id = reserved;
 }
 EXPORT_SYMBOL(rdma_rt_set_id_range);
+
+/**
+ * rdma_rt_set_id() - Set unique ID as seen by restrack,
+ *                    needed for HW-capable device
+ * @res: resrouce to operate
+ * @id: ID to set
+ *
+ * Return: 0 on success
+ */
+int rdma_rt_set_id(struct rdma_restrack_entry *res, u32 id)
+{
+	struct ib_device *dev = res_to_dev(res);
+	struct xarray *xa = rdma_dev_to_xa(dev, res->type);
+
+	if (xa_load(xa, id) == res) {
+		WARN_ONCE(true, "Tried to add non-unique %s entry %u\n",
+			  type2str(res->type), res->id);
+		return -EEXIST;
+	}
+
+	res->id = id;
+	return 0;
+}
+EXPORT_SYMBOL(rdma_rt_set_id);
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index d4f1a2ef5015..4e40a04d1857 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -258,7 +258,7 @@ static int ib_uverbs_get_context(struct uverbs_attr_bundle *attrs)
 
 	fd_install(resp.async_fd, filp);
 
-	ucontext->res.type = RDMA_RESTRACK_CTX;
+	rdma_rt_set_type(&ucontext->res, RDMA_RESTRACK_CTX);
 	rdma_restrack_uadd(&ucontext->res);
 
 	/*
@@ -417,7 +417,7 @@ static int ib_uverbs_alloc_pd(struct uverbs_attr_bundle *attrs)
 	uobj->object = pd;
 	memset(&resp, 0, sizeof resp);
 	resp.pd_handle = uobj->id;
-	pd->res.type = RDMA_RESTRACK_PD;
+	rdma_rt_set_type(&pd->res, RDMA_RESTRACK_PD);
 	rdma_restrack_uadd(&pd->res);
 
 	ret = uverbs_response(attrs, &resp, sizeof(resp));
@@ -733,7 +733,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
 	mr->dm	    = NULL;
 	mr->uobject = uobj;
 	atomic_inc(&pd->usecnt);
-	mr->res.type = RDMA_RESTRACK_MR;
+	rdma_rt_set_type(&mr->res, RDMA_RESTRACK_MR);
 	rdma_restrack_uadd(&mr->res);
 
 	uobj->object = mr;
@@ -1011,7 +1011,7 @@ static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs,
 	resp.base.cqe       = cq->cqe;
 	resp.response_length = uverbs_response_length(attrs, sizeof(resp));
 
-	cq->res.type = RDMA_RESTRACK_CQ;
+	rdma_rt_set_type(&cq->res, RDMA_RESTRACK_CQ);
 	rdma_restrack_uadd(&cq->res);
 
 	ret = uverbs_response(attrs, &resp, sizeof(resp));
diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infiniband/core/uverbs_std_types_cq.c
index a59ea89e3f2b..6ca5d5016423 100644
--- a/drivers/infiniband/core/uverbs_std_types_cq.c
+++ b/drivers/infiniband/core/uverbs_std_types_cq.c
@@ -125,7 +125,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
 	obj->uobject.object = cq;
 	obj->uobject.user_handle = user_handle;
 	atomic_set(&cq->usecnt, 0);
-	cq->res.type = RDMA_RESTRACK_CQ;
+	rdma_rt_set_type(&cq->res, RDMA_RESTRACK_CQ);
 	rdma_restrack_uadd(&cq->res);
 
 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_CREATE_CQ_RESP_CQE, &cq->cqe,
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index ac011836bb54..0a85bb2c3408 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -275,7 +275,7 @@ struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags,
 		mr_access_flags |= IB_ACCESS_REMOTE_READ | IB_ACCESS_REMOTE_WRITE;
 	}
 
-	pd->res.type = RDMA_RESTRACK_PD;
+	rdma_rt_set_type(&pd->res, RDMA_RESTRACK_PD);
 	rdma_restrack_set_task(&pd->res, caller);
 	rdma_restrack_kadd(&pd->res);
 
@@ -1907,7 +1907,7 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
 		cq->event_handler = event_handler;
 		cq->cq_context    = cq_context;
 		atomic_set(&cq->usecnt, 0);
-		cq->res.type = RDMA_RESTRACK_CQ;
+		rdma_rt_set_type(&cq->res, RDMA_RESTRACK_CQ);
 		rdma_restrack_set_task(&cq->res, caller);
 		rdma_restrack_kadd(&cq->res);
 	}
@@ -1990,7 +1990,7 @@ struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
 		mr->uobject = NULL;
 		atomic_inc(&pd->usecnt);
 		mr->need_inval = false;
-		mr->res.type = RDMA_RESTRACK_MR;
+		rdma_rt_set_type(&mr->res, RDMA_RESTRACK_MR);
 		rdma_restrack_kadd(&mr->res);
 	}
 
diff --git a/drivers/infiniband/hw/cxgb4/restrack.c b/drivers/infiniband/hw/cxgb4/restrack.c
index 9a7520ee41e0..7224742f8b9a 100644
--- a/drivers/infiniband/hw/cxgb4/restrack.c
+++ b/drivers/infiniband/hw/cxgb4/restrack.c
@@ -198,7 +198,7 @@ union union_ep {
 static int fill_res_ep_entry(struct sk_buff *msg,
 			     struct rdma_restrack_entry *res)
 {
-	struct rdma_cm_id *cm_id = rdma_res_to_id(res);
+	struct rdma_cm_id *cm_id = rdma_res_to_cmid(res);
 	struct nlattr *table_attr;
 	struct c4iw_ep_common *epcp;
 	struct c4iw_listen_ep *listen_ep = NULL;
diff --git a/include/rdma/rdma_cm.h b/include/rdma/rdma_cm.h
index 60987a5903b7..008dc8bbe2fb 100644
--- a/include/rdma/rdma_cm.h
+++ b/include/rdma/rdma_cm.h
@@ -426,6 +426,6 @@ void rdma_read_gids(struct rdma_cm_id *cm_id, union ib_gid *sgid,
 		    union ib_gid *dgid);
 
 struct iw_cm_id *rdma_iw_cm_id(struct rdma_cm_id *cm_id);
-struct rdma_cm_id *rdma_res_to_id(struct rdma_restrack_entry *res);
+struct rdma_cm_id *rdma_res_to_cmid(struct rdma_restrack_entry *res);
 
 #endif /* RDMA_CM_H */
diff --git a/include/rdma/restrack.h b/include/rdma/restrack.h
index 9d329098ddfc..aa741907d1f4 100644
--- a/include/rdma/restrack.h
+++ b/include/rdma/restrack.h
@@ -172,4 +172,26 @@ void rdma_rt_read_lock(struct ib_device *dev, enum rdma_restrack_type type);
 void rdma_rt_read_unlock(struct ib_device *dev, enum rdma_restrack_type type);
 void rdma_rt_set_id_range(struct ib_device *dev, enum rdma_restrack_type type,
 			  u32 reserved, u32 max);
+/**
+ * rdma_res_to_id() - Unique ID as seen by restrack
+ * @res: resrouce to operate
+ *
+ * Return: unique ID
+ */
+static inline u32 rdma_res_to_id(struct rdma_restrack_entry *res)
+{
+	return res->id;
+}
+int rdma_rt_set_id(struct rdma_restrack_entry *res, u32 id);
+/**
+ * rdma_rt_set_type() - Set restrack entry type,
+ *                      prior to call rdma_restrack_add()
+ * @res: resrouce to operate
+ * @type: Actual type
+ */
+static inline void rdma_rt_set_type(struct rdma_restrack_entry *res,
+				    enum rdma_restrack_type type)
+{
+	res->type = type;
+}
 #endif /* _RDMA_RESTRACK_H_ */
-- 
2.19.1




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux