From: Leon Romanovsky <leon@leon.nu>
To: Christoph Hellwig <hch@lst.de>
Cc: dledford@redhat.com, bart.vanassche@sandisk.com,
sagig@mellanox.com, swise@opengridcomputing.com,
linux-rdma@vger.kernel.org, target-devel@vger.kernel.org
Subject: Re: [PATCH v4 9/9] IB/srpt: convert to the generic RDMA READ/WRITE API
Date: Tue, 8 Mar 2016 22:13:42 +0200 [thread overview]
Message-ID: <20160308201342.GL13396@leon.nu> (raw)
In-Reply-To: <1457461000-24088-10-git-send-email-hch@lst.de>
On Tue, Mar 08, 2016 at 07:16:40PM +0100, Christoph Hellwig wrote:
> Replace the homegrown RDMA READ/WRITE code in srpt with the generic API.
> The only real twist here is that we need to allocate one Linux scatterlist
> per direct buffer in the SRP command, and chain them before handing them
> off to the target core.
>
> As a side-effect of the conversion the driver will also chain the SEND
> of the SRP response to the RDMA WRITE WRs for a DATA OUT command, and
> properly account for RDMA WRITE WRs instead of just for RDMA READ WRs
> like the driver previously did.
>
> We now allocate half of the SQ size to RDMA READ/WRITE contexts, assuming
> by default one RDMA READ or WRITE operation per command. If a command
> has multiple operations it will eat into the budget but will still succeed,
> possible after waiting for WQEs to be available.
>
> Also ensure the QPs request the maximum allowed SGEs so that RDMA R/W API
> works correctly.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> drivers/infiniband/ulp/srpt/ib_srpt.c | 693 +++++++++++-----------------------
> drivers/infiniband/ulp/srpt/ib_srpt.h | 30 +-
> 2 files changed, 242 insertions(+), 481 deletions(-)
>
> diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
> index 25bdaee..05bdec8 100644
> --- a/drivers/infiniband/ulp/srpt/ib_srpt.c
> +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
> @@ -765,52 +765,6 @@ static int srpt_post_recv(struct srpt_device *sdev,
> }
>
> /**
> - * srpt_post_send() - Post an IB send request.
> - *
> - * Returns zero upon success and a non-zero value upon failure.
> - */
> -static int srpt_post_send(struct srpt_rdma_ch *ch,
> - struct srpt_send_ioctx *ioctx, int len)
> -{
> - struct ib_sge list;
> - struct ib_send_wr wr, *bad_wr;
> - struct srpt_device *sdev = ch->sport->sdev;
> - int ret;
> -
> - atomic_inc(&ch->req_lim);
> -
> - ret = -ENOMEM;
> - if (unlikely(atomic_dec_return(&ch->sq_wr_avail) < 0)) {
> - pr_warn("IB send queue full (needed 1)\n");
> - goto out;
> - }
> -
> - ib_dma_sync_single_for_device(sdev->device, ioctx->ioctx.dma, len,
> - DMA_TO_DEVICE);
> -
> - list.addr = ioctx->ioctx.dma;
> - list.length = len;
> - list.lkey = sdev->pd->local_dma_lkey;
> -
> - ioctx->ioctx.cqe.done = srpt_send_done;
> - wr.next = NULL;
> - wr.wr_cqe = &ioctx->ioctx.cqe;
> - wr.sg_list = &list;
> - wr.num_sge = 1;
> - wr.opcode = IB_WR_SEND;
> - wr.send_flags = IB_SEND_SIGNALED;
> -
> - ret = ib_post_send(ch->qp, &wr, &bad_wr);
> -
> -out:
> - if (ret < 0) {
> - atomic_inc(&ch->sq_wr_avail);
> - atomic_dec(&ch->req_lim);
> - }
> - return ret;
> -}
> -
> -/**
> * srpt_zerolength_write() - Perform a zero-length RDMA write.
> *
> * A quote from the InfiniBand specification: C9-88: For an HCA responder
> @@ -843,6 +797,110 @@ static void srpt_zerolength_write_done(struct ib_cq *cq, struct ib_wc *wc)
> }
> }
>
> +static int srpt_alloc_rw_ctxs(struct srpt_send_ioctx *ioctx,
> + struct srp_direct_buf *db, int nbufs, struct scatterlist **sg,
> + unsigned *sg_cnt)
> +{
> + enum dma_data_direction dir = target_reverse_dma_direction(&ioctx->cmd);
> + struct srpt_rdma_ch *ch = ioctx->ch;
> + struct scatterlist *prev = NULL;
> + unsigned prev_nents;
> + int ret, i;
> +
> + if (nbufs == 1) {
> + ioctx->rw_ctxs = &ioctx->s_rw_ctx;
> + } else {
> + ioctx->rw_ctxs = kmalloc_array(nbufs, sizeof(*ioctx->rw_ctxs),
> + GFP_KERNEL);
> + if (!ioctx->rw_ctxs)
> + return -ENOMEM;
> + }
> +
> + for (i = 0; i < nbufs; i++, db++) {
> + struct srpt_rw_ctx *ctx = &ioctx->rw_ctxs[i];
> + u64 remote_addr = be64_to_cpu(db->va);
> + u32 size = be32_to_cpu(db->len);
> + u32 rkey = be32_to_cpu(db->key);
> +
> + ret = target_alloc_sgl(&ctx->sg, &ctx->nents, size, false,
> + i < nbufs - 1);
> + if (ret)
> + goto unwind;
> +
> + ret = rdma_rw_ctx_init(&ctx->rw, ch->qp, ch->sport->port,
> + ctx->sg, ctx->nents, 0, remote_addr, rkey, dir);
> + if (ret < 0) {
> + target_free_sgl(ctx->sg, ctx->nents);
> + goto unwind;
> + }
> +
> + ioctx->n_rdma += ret;
> +
> + if (prev) {
> + sg_unmark_end(&prev[prev_nents - 1]);
> + sg_chain(prev, prev_nents + 1, ctx->sg);
> + } else {
> + *sg = ctx->sg;
> + }
> +
> + prev = ctx->sg;
> + prev_nents = ctx->nents;
> +
> + *sg_cnt += ctx->nents;
> + }
> +
> + ioctx->n_rw_ctx = nbufs;
> + return 0;
> +
> +unwind:
> + while (--i >= 0) {
> + struct srpt_rw_ctx *ctx = &ioctx->rw_ctxs[i];
> +
> + rdma_rw_ctx_destroy(&ctx->rw, ch->qp, ch->sport->port,
> + ctx->sg, ctx->nents, dir);
> + target_free_sgl(ctx->sg, ctx->nents);
> + }
> + if (ioctx->rw_ctxs && ioctx->rw_ctxs != &ioctx->s_rw_ctx)
You can jump to unwind label from one place only. In that stage
"ioctx->rw_ctxs != NULL" will always be true.
> + kfree(ioctx->rw_ctxs);
> + return ret;
> +}
next prev parent reply other threads:[~2016-03-08 20:13 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-08 18:16 generic RDMA READ/WRITE API V4 Christoph Hellwig
2016-03-08 18:16 ` [PATCH v4 1/9] IB/cma: pass the port number to ib_create_qp Christoph Hellwig
2016-03-08 19:25 ` Bart Van Assche
2016-03-08 19:27 ` Leon Romanovsky
[not found] ` <20160308192709.GJ13396-2ukJVAZIZ/Y@public.gmane.org>
2016-03-08 19:38 ` Steve Wise
2016-03-08 19:55 ` Leon Romanovsky
2016-03-09 13:58 ` 'Christoph Hellwig'
[not found] ` <20160309135804.GA32315-jcswGhMUV9g@public.gmane.org>
2016-03-09 14:43 ` Leon Romanovsky
2016-03-09 15:51 ` Steve Wise
2016-03-09 15:52 ` 'Christoph Hellwig'
2016-03-08 18:16 ` [PATCH v4 2/9] IB/core: allow passing mapping an offset into the SG in ib_map_mr_sg Christoph Hellwig
2016-03-08 19:27 ` Bart Van Assche
2016-03-08 18:16 ` [PATCH v4 3/9] IB/core: add a helper to check for READ WITH INVALIDATE support Christoph Hellwig
2016-03-08 18:16 ` [PATCH v4 4/9] IB/core: refactor ib_create_qp Christoph Hellwig
2016-03-08 19:33 ` Bart Van Assche
[not found] ` <56DF2917.309-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-03-09 12:55 ` Christoph Hellwig
2016-03-08 18:16 ` [PATCH v4 5/9] IB/core: add a simple MR pool Christoph Hellwig
[not found] ` <1457461000-24088-6-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-03-08 19:37 ` Bart Van Assche
2016-03-09 12:56 ` Christoph Hellwig
[not found] ` <1457461000-24088-1-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-03-08 18:16 ` [PATCH v4 6/9] IB/core: add a need_inval flag to struct ib_mr Christoph Hellwig
2016-03-08 19:41 ` Bart Van Assche
2016-03-08 18:16 ` [PATCH v4 7/9] IB/core: generic RDMA READ/WRITE API Christoph Hellwig
2016-03-08 21:32 ` Bart Van Assche
2016-03-09 13:07 ` Christoph Hellwig
2016-03-09 15:54 ` Christoph Hellwig
2016-03-09 18:55 ` Bart Van Assche
2016-03-10 7:57 ` Christoph Hellwig
2016-03-10 15:30 ` Bart Van Assche
[not found] ` <56E1931C.1040206-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-03-10 16:21 ` Christoph Hellwig
[not found] ` <20160310162150.GA9544-jcswGhMUV9g@public.gmane.org>
2016-03-10 17:00 ` Bart Van Assche
[not found] ` <56E1A810.1080001-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-03-10 17:01 ` Christoph Hellwig
2016-03-11 22:39 ` Bart Van Assche
[not found] ` <56E34914.2020108-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-03-12 6:12 ` Christoph Hellwig
[not found] ` <20160312061232.GA15236-jcswGhMUV9g@public.gmane.org>
2016-03-14 1:04 ` Bart Van Assche
[not found] ` <56E60E0F.7060900-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-03-15 8:45 ` Christoph Hellwig
[not found] ` <20160309155457.GA1898-jcswGhMUV9g@public.gmane.org>
2016-03-11 1:26 ` Bart Van Assche
2016-03-11 9:22 ` Christoph Hellwig
2016-03-08 18:16 ` [PATCH v4 8/9] target: enhance and export target_alloc_sgl/target_free_sgl Christoph Hellwig
2016-03-08 21:37 ` Bart Van Assche
2016-03-08 18:16 ` [PATCH v4 9/9] IB/srpt: convert to the generic RDMA READ/WRITE API Christoph Hellwig
2016-03-08 20:13 ` Leon Romanovsky [this message]
2016-03-09 12:59 ` Christoph Hellwig
2016-03-10 22:08 ` Bart Van Assche
2016-03-11 9:09 ` Christoph Hellwig
[not found] ` <1457461000-24088-10-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-03-10 22:40 ` Bart Van Assche
[not found] ` <56E1F7C8.9000101-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-03-11 9:14 ` Christoph Hellwig
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=20160308201342.GL13396@leon.nu \
--to=leon@leon.nu \
--cc=bart.vanassche@sandisk.com \
--cc=dledford@redhat.com \
--cc=hch@lst.de \
--cc=linux-rdma@vger.kernel.org \
--cc=sagig@mellanox.com \
--cc=swise@opengridcomputing.com \
--cc=target-devel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.