aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Wise <swise@opengridcomputing.com>2007-01-19 15:16:59 -0600
committerRoland Dreier <rolandd@cisco.com>2007-01-29 09:16:12 -0800
commit8b3d225476c99ea29a68109a7d40e5ef353d4388 (patch)
tree7513a01d3c43d61f170739fa662cc78c5e9e1192
parent02ccdc3573c28a5c750e67723b4fed80ce2da870 (diff)
downloadlibibverbs-8b3d225476c99ea29a68109a7d40e5ef353d4388.tar.gz
The ibv_cmd_* create functions need to set context
If the ibv_cmd_* create function succeeds, then the object context pointer must be set by that function so that the corresponding destroy function will work. This avoids problems in the error cleanup path of a low-level driver's create function that fails after calling an ibv_cmd_* create function. Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--src/cmd.c21
-rw-r--r--src/verbs.c16
2 files changed, 16 insertions, 21 deletions
diff --git a/src/cmd.c b/src/cmd.c
index b267603..f7d3fde 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -209,7 +209,8 @@ int ibv_cmd_alloc_pd(struct ibv_context *context, struct ibv_pd *pd,
VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
- pd->handle = resp->pd_handle;
+ pd->handle = resp->pd_handle;
+ pd->context = context;
return 0;
}
@@ -250,6 +251,7 @@ int ibv_cmd_reg_mr(struct ibv_pd *pd, void *addr, size_t length,
mr->handle = resp->mr_handle;
mr->lkey = resp->lkey;
mr->rkey = resp->rkey;
+ mr->context = pd->context;
return 0;
}
@@ -289,8 +291,9 @@ static int ibv_cmd_create_cq_v2(struct ibv_context *context, int cqe,
VALGRIND_MAKE_MEM_DEFINED(resp, sizeof resp_size);
- cq->handle = resp->cq_handle;
- cq->cqe = resp->cqe;
+ cq->handle = resp->cq_handle;
+ cq->cqe = resp->cqe;
+ cq->context = context;
return 0;
}
@@ -317,8 +320,9 @@ int ibv_cmd_create_cq(struct ibv_context *context, int cqe,
VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
- cq->handle = resp->cq_handle;
- cq->cqe = resp->cqe;
+ cq->handle = resp->cq_handle;
+ cq->cqe = resp->cqe;
+ cq->context = context;
return 0;
}
@@ -458,7 +462,8 @@ int ibv_cmd_create_srq(struct ibv_pd *pd,
VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
- srq->handle = resp->srq_handle;
+ srq->handle = resp->srq_handle;
+ srq->context = pd->context;
if (abi_ver > 5) {
attr->attr.max_wr = resp->max_wr;
@@ -607,6 +612,7 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
qp->handle = resp->qp_handle;
qp->qp_num = resp->qpn;
+ qp->context = pd->context;
if (abi_ver > 3) {
attr->cap.max_recv_sge = resp->max_recv_sge;
@@ -1025,7 +1031,8 @@ int ibv_cmd_create_ah(struct ibv_pd *pd, struct ibv_ah *ah,
VALGRIND_MAKE_MEM_DEFINED(&resp, sizeof resp);
- ah->handle = resp.handle;
+ ah->handle = resp.handle;
+ ah->context = pd->context;
return 0;
}
diff --git a/src/verbs.c b/src/verbs.c
index 6ac56d3..f719572 100644
--- a/src/verbs.c
+++ b/src/verbs.c
@@ -134,13 +134,7 @@ int ibv_query_pkey(struct ibv_context *context, uint8_t port_num,
struct ibv_pd *ibv_alloc_pd(struct ibv_context *context)
{
- struct ibv_pd *pd;
-
- pd = context->ops.alloc_pd(context);
- if (pd)
- pd->context = context;
-
- return pd;
+ return context->ops.alloc_pd(context);
}
int ibv_dealloc_pd(struct ibv_pd *pd)
@@ -158,7 +152,6 @@ struct ibv_mr *ibv_reg_mr(struct ibv_pd *pd, void *addr,
mr = pd->context->ops.reg_mr(pd, addr, length, access);
if (mr) {
- mr->context = pd->context;
mr->pd = pd;
mr->addr = addr;
mr->length = length;
@@ -248,7 +241,6 @@ struct ibv_cq *ibv_create_cq(struct ibv_context *context, int cqe, void *cq_cont
comp_vector);
if (cq) {
- cq->context = context;
cq->cq_context = cq_context;
cq->comp_events_completed = 0;
cq->async_events_completed = 0;
@@ -308,7 +300,6 @@ struct ibv_srq *ibv_create_srq(struct ibv_pd *pd,
srq = pd->context->ops.create_srq(pd, srq_init_attr);
if (srq) {
- srq->context = pd->context;
srq->srq_context = srq_init_attr->srq_context;
srq->pd = pd;
srq->events_completed = 0;
@@ -342,7 +333,6 @@ struct ibv_qp *ibv_create_qp(struct ibv_pd *pd,
struct ibv_qp *qp = pd->context->ops.create_qp(pd, qp_init_attr);
if (qp) {
- qp->context = pd->context;
qp->qp_context = qp_init_attr->qp_context;
qp->pd = pd;
qp->send_cq = qp_init_attr->send_cq;
@@ -397,10 +387,8 @@ struct ibv_ah *ibv_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr)
{
struct ibv_ah *ah = pd->context->ops.create_ah(pd, attr);
- if (ah) {
- ah->context = pd->context;
+ if (ah)
ah->pd = pd;
- }
return ah;
}