From: Michal Kalderon <mkalderon@marvell.com>
To: Bernard Metzler <bmt@zurich.ibm.com>,
"linux-rdma@vger.kernel.org" <linux-rdma@vger.kernel.org>
Subject: RE: [EXT] [RFC] RDMA/siw: Fix xa_mmap helper patch
Date: Mon, 2 Sep 2019 14:56:11 +0000 [thread overview]
Message-ID: <MN2PR18MB31826FBE561D7D75CDEFB859A1BE0@MN2PR18MB3182.namprd18.prod.outlook.com> (raw)
In-Reply-To: <20190902141854.19822-1-bmt@zurich.ibm.com>
> From: Bernard Metzler <bmt@zurich.ibm.com>
> Sent: Monday, September 2, 2019 5:19 PM
> External Email
>
> ----------------------------------------------------------------------
> - make the siw_user_mmap_entry.address a void *, which
> naturally fits with remap_vmalloc_range. also avoids
> other casting during resource address assignment.
>
> - do not kfree SQ/RQ/CQ/SRQ in preparation of mmap.
> Those resources are always further needed ;)
>
> - Fix check for correct mmap range in siw_mmap().
> - entry->length is the object length. We have to
> expand to PAGE_ALIGN(entry->length), since mmap
> comes with complete page(s) containing the
> object.
> - put mmap_entry if that check fails. Otherwise
> entry object ref counting screws up, and later
> crashes during context close.
>
> - simplify siw_mmap_free() - it must just free
> the entry.
Thanks Bernard, I will incorporate this patch into the series, with some minor changes
please see
Some comments below
Do your tests pass with this patch below ?
- I also added back the places that free the memory no longer freed in mmap_free
And also added checks on the key on places that remove them to be closer to original
Code. I have changed the length to size_t
Will send the v9 later on today.
Thanks for your help
Michal
> ---
> drivers/infiniband/sw/siw/siw.h | 2 +-
> drivers/infiniband/sw/siw/siw_verbs.c | 59 +++++++++------------------
> 2 files changed, 20 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/infiniband/sw/siw/siw.h
> b/drivers/infiniband/sw/siw/siw.h index d48cd42ae43e..d62f18f49ac5 100644
> --- a/drivers/infiniband/sw/siw/siw.h
> +++ b/drivers/infiniband/sw/siw/siw.h
> @@ -505,7 +505,7 @@ struct iwarp_msg_info {
>
> struct siw_user_mmap_entry {
> struct rdma_user_mmap_entry rdma_entry;
> - u64 address;
> + void *address;
> u64 length;
> };
>
> diff --git a/drivers/infiniband/sw/siw/siw_verbs.c
> b/drivers/infiniband/sw/siw/siw_verbs.c
> index 9e049241051e..24bdf5b508e6 100644
> --- a/drivers/infiniband/sw/siw/siw_verbs.c
> +++ b/drivers/infiniband/sw/siw/siw_verbs.c
> @@ -36,10 +36,7 @@ static char ib_qp_state_to_string[IB_QPS_ERR +
> 1][sizeof("RESET")] = {
>
> void siw_mmap_free(struct rdma_user_mmap_entry *rdma_entry) {
> - struct siw_user_mmap_entry *entry =
> to_siw_mmap_entry(rdma_entry);
> -
> - vfree((void *)entry->address);
> - kfree(entry);
> + kfree(rdma_entry);
I think it is better practice to free the entry and not rdma_entry for the same reason
We use container_of and not just cast.
> }
>
> int siw_mmap(struct ib_ucontext *ctx, struct vm_area_struct *vma) @@ -
> 56,29 +53,28 @@ int siw_mmap(struct ib_ucontext *ctx, struct
> vm_area_struct *vma)
> */
> if (vma->vm_start & (PAGE_SIZE - 1)) {
> pr_warn("siw: mmap not page aligned\n");
> - goto out;
> + return -EINVAL;
> }
> rdma_entry = rdma_user_mmap_entry_get(&uctx->base_ucontext,
> off,
> size, vma);
> if (!rdma_entry) {
> siw_dbg(&uctx->sdev->base_dev, "mmap lookup failed: %lu,
> %u\n",
> off, size);
> - goto out;
> + return -EINVAL;
> }
> entry = to_siw_mmap_entry(rdma_entry);
> - if (entry->length != size) {
> + if (PAGE_ALIGN(entry->length) != size) {
> siw_dbg(&uctx->sdev->base_dev,
> "key[%#lx] does not have valid length[%#x]
> expected[%#llx]\n",
> off, size, entry->length);
> + rdma_user_mmap_entry_put(&uctx->base_ucontext,
> rdma_entry);
> return -EINVAL;
> }
> -
> - rv = remap_vmalloc_range(vma, (void *)entry->address, 0);
> + rv = remap_vmalloc_range(vma, entry->address, 0);
> if (rv) {
> pr_warn("remap_vmalloc_range failed: %lu, %u\n", off,
> size);
> rdma_user_mmap_entry_put(&uctx->base_ucontext,
> rdma_entry);
> }
> -out:
> return rv;
> }
>
> @@ -270,7 +266,7 @@ void siw_qp_put_ref(struct ib_qp *base_qp) }
>
> static int siw_user_mmap_entry_insert(struct ib_ucontext *ucontext,
> - u64 address, u64 length,
> + void *address, u64 length,
> u64 *key)
> {
> struct siw_user_mmap_entry *entry = kzalloc(sizeof(*entry),
> GFP_KERNEL); @@ -461,30 +457,22 @@ struct ib_qp *siw_create_qp(struct
> ib_pd *pd,
> if (qp->sendq) {
> length = num_sqe * sizeof(struct siw_sqe);
> rv = siw_user_mmap_entry_insert(&uctx-
> >base_ucontext,
> - (uintptr_t)qp-
> >sendq,
> - length, &key);
> - if (!rv)
> + qp->sendq, length,
> + &key);
> + if (rv)
> goto err_out_xa;
>
> - /* If entry was inserted successfully, qp->sendq
> - * will be freed by siw_mmap_free
> - */
> - qp->sendq = NULL;
> qp->sq_key = key;
> }
>
> if (qp->recvq) {
> length = num_rqe * sizeof(struct siw_rqe);
> rv = siw_user_mmap_entry_insert(&uctx-
> >base_ucontext,
> - (uintptr_t)qp->recvq,
> - length, &key);
> - if (!rv)
> + qp->recvq, length,
> + &key);
> + if (rv)
> goto err_out_mmap_rem;
>
> - /* If entry was inserted successfully, qp->recvq will
> - * be freed by siw_mmap_free
> - */
> - qp->recvq = NULL;
> qp->rq_key = key;
> }
>
> @@ -1078,16 +1066,11 @@ int siw_create_cq(struct ib_cq *base_cq, const
> struct ib_cq_init_attr *attr,
> sizeof(struct siw_cq_ctrl);
>
> rv = siw_user_mmap_entry_insert(&ctx->base_ucontext,
> - (uintptr_t)cq->queue,
> - length, &cq->cq_key);
> - if (!rv)
> + cq->queue, length,
> + &cq->cq_key);
> + if (rv)
> goto err_out;
>
> - /* If entry was inserted successfully, cq->queue will be freed
> - * by siw_mmap_free
> - */
> - cq->queue = NULL;
> -
> uresp.cq_key = cq->cq_key;
> uresp.cq_id = cq->id;
> uresp.num_cqe = size;
> @@ -1535,15 +1518,11 @@ int siw_create_srq(struct ib_srq *base_srq,
> u64 length = srq->num_rqe * sizeof(struct siw_rqe);
>
> rv = siw_user_mmap_entry_insert(&ctx->base_ucontext,
> - (uintptr_t)srq->recvq,
> - length, &srq->srq_key);
> - if (!rv)
> + srq->recvq, length,
> + &srq->srq_key);
> + if (rv)
> goto err_out;
>
> - /* If entry was inserted successfully, srq->recvq will be freed
> - * by siw_mmap_free
> - */
> - srq->recvq = NULL;
> uresp.srq_key = srq->srq_key;
> uresp.num_rqe = srq->num_rqe;
>
> --
> 2.17.2
next prev parent reply other threads:[~2019-09-02 14:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-02 14:18 [RFC] RDMA/siw: Fix xa_mmap helper patch Bernard Metzler
2019-09-02 14:56 ` Michal Kalderon [this message]
2019-09-02 15:22 ` RE: [EXT] " Bernard Metzler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MN2PR18MB31826FBE561D7D75CDEFB859A1BE0@MN2PR18MB3182.namprd18.prod.outlook.com \
--to=mkalderon@marvell.com \
--cc=bmt@zurich.ibm.com \
--cc=linux-rdma@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).