> From: Bernard Metzler <BMT@xxxxxxxxxxxxxx> > Sent: Wednesday, September 4, 2019 2:09 PM > External Email > > ---------------------------------------------------------------------- > > > > if (qp) { > >- if (qp->xa_sq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&uctx->xa, qp->xa_sq_index)); > >- if (qp->xa_rq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&uctx->xa, qp->xa_rq_index)); > >- > >+ rdma_user_mmap_entry_remove(&uctx->base_ucontext, > qp->sq_key); > >+ rdma_user_mmap_entry_remove(&uctx->base_ucontext, > qp->rq_key); > > Unfortunately, now we need a check if 'uctx' is valid. > For a kernel client's QP, it is not. In siw_destroy_qp() below, it is handled > correctly... > Ok, I'll send you a fixed patch, please review, once you ack I'll release another series With the fixed and acked patch. Thanks, > > > vfree(qp->sendq); > > vfree(qp->recvq); > > kfree(qp); > >@@ -620,10 +624,10 @@ int siw_destroy_qp(struct ib_qp *base_qp, struct > >ib_udata *udata) > > qp->attrs.flags |= SIW_QP_IN_DESTROY; > > qp->rx_stream.rx_suspend = 1; > > > >- if (uctx && qp->xa_sq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&uctx->xa, qp->xa_sq_index)); > >- if (uctx && qp->xa_rq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&uctx->xa, qp->xa_rq_index)); > >+ if (uctx) > >+ rdma_user_mmap_entry_remove(&uctx->base_ucontext, > qp->sq_key); > >+ if (uctx) > >+ rdma_user_mmap_entry_remove(&uctx->base_ucontext, > qp->rq_key); > > > > down_write(&qp->state_lock); > > > >@@ -993,8 +997,8 @@ void siw_destroy_cq(struct ib_cq *base_cq, struct > >ib_udata *udata) > > > > siw_cq_flush(cq); > > > >- if (ctx && cq->xa_cq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&ctx->xa, cq->xa_cq_index)); > >+ if (ctx) > >+ rdma_user_mmap_entry_remove(&ctx->base_ucontext, > cq->cq_key); > > > > atomic_dec(&sdev->num_cq); > > > >@@ -1031,7 +1035,7 @@ int siw_create_cq(struct ib_cq *base_cq, const > >struct ib_cq_init_attr *attr, > > size = roundup_pow_of_two(size); > > cq->base_cq.cqe = size; > > cq->num_cqe = size; > >- cq->xa_cq_index = SIW_INVAL_UOBJ_KEY; > >+ cq->cq_key = RDMA_USER_MMAP_INVALID; > > > > if (!udata) { > > cq->kernel_verbs = 1; > >@@ -1057,16 +1061,16 @@ int siw_create_cq(struct ib_cq *base_cq, const > >struct ib_cq_init_attr *attr, > > struct siw_ucontext *ctx = > > rdma_udata_to_drv_context(udata, struct > siw_ucontext, > > base_ucontext); > >+ size_t length = size * sizeof(struct siw_cqe) + > >+ sizeof(struct siw_cq_ctrl); > > > >- cq->xa_cq_index = > >- siw_create_uobj(ctx, cq->queue, > >- size * sizeof(struct siw_cqe) + > >- sizeof(struct siw_cq_ctrl)); > >- if (cq->xa_cq_index == SIW_INVAL_UOBJ_KEY) { > >- rv = -ENOMEM; > >+ rv = siw_user_mmap_entry_insert(&ctx->base_ucontext, > >+ cq->queue, length, > >+ &cq->cq_key); > >+ if (rv) > > goto err_out; > >- } > >- uresp.cq_key = cq->xa_cq_index << PAGE_SHIFT; > >+ > >+ uresp.cq_key = cq->cq_key; > > uresp.cq_id = cq->id; > > uresp.num_cqe = size; > > > >@@ -1087,8 +1091,7 @@ int siw_create_cq(struct ib_cq *base_cq, const > >struct ib_cq_init_attr *attr, > > struct siw_ucontext *ctx = > > rdma_udata_to_drv_context(udata, struct > siw_ucontext, > > base_ucontext); > >- if (cq->xa_cq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&ctx->xa, cq->xa_cq_index)); > >+ rdma_user_mmap_entry_remove(&ctx->base_ucontext, > cq->cq_key); > > same comment as above - we have to check if 'ctx' is valid. > > > vfree(cq->queue); > > } > > atomic_dec(&sdev->num_cq); > >@@ -1490,7 +1493,7 @@ int siw_create_srq(struct ib_srq *base_srq, > > } > > srq->max_sge = attrs->max_sge; > > srq->num_rqe = roundup_pow_of_two(attrs->max_wr); > >- srq->xa_srq_index = SIW_INVAL_UOBJ_KEY; > >+ srq->srq_key = RDMA_USER_MMAP_INVALID; > > srq->limit = attrs->srq_limit; > > if (srq->limit) > > srq->armed = 1; > >@@ -1509,15 +1512,15 @@ int siw_create_srq(struct ib_srq *base_srq, > > } > > if (udata) { > > struct siw_uresp_create_srq uresp = {}; > >+ size_t length = srq->num_rqe * sizeof(struct siw_rqe); > > > >- srq->xa_srq_index = siw_create_uobj( > >- ctx, srq->recvq, srq->num_rqe * sizeof(struct > siw_rqe)); > >- > >- if (srq->xa_srq_index == SIW_INVAL_UOBJ_KEY) { > >- rv = -ENOMEM; > >+ rv = siw_user_mmap_entry_insert(&ctx->base_ucontext, > >+ srq->recvq, length, > >+ &srq->srq_key); > >+ if (rv) > > goto err_out; > >- } > >- uresp.srq_key = srq->xa_srq_index; > >+ > >+ uresp.srq_key = srq->srq_key; > > uresp.num_rqe = srq->num_rqe; > > > > if (udata->outlen < sizeof(uresp)) { @@ -1536,8 +1539,9 @@ > int > >siw_create_srq(struct ib_srq *base_srq, > > > > err_out: > > if (srq->recvq) { > >- if (ctx && srq->xa_srq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&ctx->xa, srq->xa_srq_index)); > >+ if (ctx) > >+ rdma_user_mmap_entry_remove(&ctx- > >base_ucontext, > >+ srq->srq_key); > > vfree(srq->recvq); > > } > > atomic_dec(&sdev->num_srq); > >@@ -1623,9 +1627,9 @@ void siw_destroy_srq(struct ib_srq *base_srq, > >struct ib_udata *udata) > > rdma_udata_to_drv_context(udata, struct siw_ucontext, > > base_ucontext); > > > >- if (ctx && srq->xa_srq_index != SIW_INVAL_UOBJ_KEY) > >- kfree(xa_erase(&ctx->xa, srq->xa_srq_index)); > >- > >+ if (ctx) > >+ rdma_user_mmap_entry_remove(&ctx->base_ucontext, > >+ srq->srq_key); > > vfree(srq->recvq); > > atomic_dec(&sdev->num_srq); > > } > >diff --git a/drivers/infiniband/sw/siw/siw_verbs.h > >b/drivers/infiniband/sw/siw/siw_verbs.h > >index 1910869281cb..1a731989fad6 100644 > >--- a/drivers/infiniband/sw/siw/siw_verbs.h > >+++ b/drivers/infiniband/sw/siw/siw_verbs.h > >@@ -83,6 +83,7 @@ void siw_destroy_srq(struct ib_srq *base_srq, struct > >ib_udata *udata); int siw_post_srq_recv(struct ib_srq *base_srq, const > >struct ib_recv_wr *wr, > > const struct ib_recv_wr **bad_wr); int siw_mmap(struct > >ib_ucontext *ctx, struct vm_area_struct *vma); > >+void siw_mmap_free(struct rdma_user_mmap_entry *rdma_entry); > > void siw_qp_event(struct siw_qp *qp, enum ib_event_type type); void > >siw_cq_event(struct siw_cq *cq, enum ib_event_type type); void > >siw_srq_event(struct siw_srq *srq, enum ib_event_type type); > >-- > >2.14.5 > > > >