aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Dreier <rolandd@cisco.com>2007-01-29 09:17:50 -0800
committerRoland Dreier <rolandd@cisco.com>2007-01-29 09:17:50 -0800
commit5eaee85aec025be16e5aeeaac64abc6d8d9c191c (patch)
tree929b122c78d1abfd075008b5b89cfd85adda03e6
parent9fc3f4d57105a5d9e7e19fd8cfa7c694eb307d99 (diff)
downloadlibibverbs-5eaee85aec025be16e5aeeaac64abc6d8d9c191c.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> (cherry picked from commit 8b3d225476c99ea29a68109a7d40e5ef353d4388)
-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 2f17765..77a137a 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -208,7 +208,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;
}
@@ -249,6 +250,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;
}
@@ -288,8 +290,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;
}
@@ -316,8 +319,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;
}
@@ -457,7 +461,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;
@@ -606,6 +611,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;
@@ -1024,7 +1030,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 706b2b0..964ca0f 100644
--- a/src/verbs.c
+++ b/src/verbs.c
@@ -133,13 +133,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)
@@ -154,7 +148,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;
}
@@ -233,7 +226,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;
@@ -293,7 +285,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;
@@ -327,7 +318,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;
@@ -382,10 +372,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;
}