]> git.openfabrics.org - ~shefty/libibverbs.git/commitdiff
The ibv_cmd_* create functions need to set context
authorRoland Dreier <rolandd@cisco.com>
Mon, 29 Jan 2007 17:17:50 +0000 (09:17 -0800)
committerRoland Dreier <rolandd@cisco.com>
Mon, 29 Jan 2007 17:17:50 +0000 (09:17 -0800)
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)

src/cmd.c
src/verbs.c

index 2f17765bd535e81339b6ddd319c6a94bcd469be2..77a137a117f4ef6403d5320ee984c41ca44f9246 100644 (file)
--- 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;
 }
index 706b2b05e10db1c9adac5acdebcb78c0f6ad44fb..964ca0fc72718da5acb4c931cd8246ff158fce0c 100644 (file)
@@ -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;
 }