All of lore.kernel.org
 help / color / mirror / Atom feed
From: Leon Romanovsky <leon@kernel.org>
To: Bernard Metzler <bmt@zurich.ibm.com>
Cc: linux-rdma@vger.kernel.org, bharat@chelsio.com, jgg@ziepe.ca,
	nirranjan@chelsio.com, krishna2@chelsio.com, bvanassche@acm.org
Subject: Re: [[PATCH v2 for-next]] RDMA/siw: Fix SQ/RQ drain logic
Date: Wed, 2 Oct 2019 18:47:28 +0300	[thread overview]
Message-ID: <20191002154728.GH5855@unreal> (raw)
In-Reply-To: <20191002143858.4550-1-bmt@zurich.ibm.com>

On Wed, Oct 02, 2019 at 04:38:58PM +0200, Bernard Metzler wrote:
> Storage ULPs (e.g. iSER & NVMeOF) use ib_drain_qp() to
> drain QP/CQ. Current SIW's own drain routines do not properly
> wait until all SQ/RQ elements are completed and reaped
> from the CQ. This may cause touch after free issues.
> New logic relies on generic __ib_drain_sq()/__ib_drain_rq()
> posting a final work request, which SIW immediately flushes
> to CQ.
>
> Fixes: 303ae1cdfdf7 ("rdma/siw: application interface")
> Signed-off-by: Krishnamraju Eraparaju <krishna2@chelsio.com>
> Signed-off-by: Bernard Metzler <bmt@zurich.ibm.com>
> ---
> v1 -> v2:
> - Accept SQ and RQ work requests, if QP is in ERROR
>   state. In that case, immediately flush WR's to CQ.
>   This already provides needed functionality to
>   support ib_drain_sq()/ib_drain_rq() without extra
>   state checking in the fast path.
>
>  drivers/infiniband/sw/siw/siw_main.c  |  20 -----
>  drivers/infiniband/sw/siw/siw_verbs.c | 103 +++++++++++++++++++++-----
>  2 files changed, 86 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/infiniband/sw/siw/siw_main.c b/drivers/infiniband/sw/siw/siw_main.c
> index 05a92f997f60..fb01407a310f 100644
> --- a/drivers/infiniband/sw/siw/siw_main.c
> +++ b/drivers/infiniband/sw/siw/siw_main.c
> @@ -248,24 +248,6 @@ static struct ib_qp *siw_get_base_qp(struct ib_device *base_dev, int id)
>  	return NULL;
>  }
>
> -static void siw_verbs_sq_flush(struct ib_qp *base_qp)
> -{
> -	struct siw_qp *qp = to_siw_qp(base_qp);
> -
> -	down_write(&qp->state_lock);
> -	siw_sq_flush(qp);
> -	up_write(&qp->state_lock);
> -}
> -
> -static void siw_verbs_rq_flush(struct ib_qp *base_qp)
> -{
> -	struct siw_qp *qp = to_siw_qp(base_qp);
> -
> -	down_write(&qp->state_lock);
> -	siw_rq_flush(qp);
> -	up_write(&qp->state_lock);
> -}
> -
>  static const struct ib_device_ops siw_device_ops = {
>  	.owner = THIS_MODULE,
>  	.uverbs_abi_ver = SIW_ABI_VERSION,
> @@ -284,8 +266,6 @@ static const struct ib_device_ops siw_device_ops = {
>  	.destroy_cq = siw_destroy_cq,
>  	.destroy_qp = siw_destroy_qp,
>  	.destroy_srq = siw_destroy_srq,
> -	.drain_rq = siw_verbs_rq_flush,
> -	.drain_sq = siw_verbs_sq_flush,
>  	.get_dma_mr = siw_get_dma_mr,
>  	.get_port_immutable = siw_get_port_immutable,
>  	.iw_accept = siw_accept,
> diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/siw/siw_verbs.c
> index 869e02b69a01..40e68e7a4f39 100644
> --- a/drivers/infiniband/sw/siw/siw_verbs.c
> +++ b/drivers/infiniband/sw/siw/siw_verbs.c
> @@ -687,6 +687,47 @@ static int siw_copy_inline_sgl(const struct ib_send_wr *core_wr,
>  	return bytes;
>  }
>
> +/* Complete SQ WR's without processing */
> +static int siw_sq_flush_wr(struct siw_qp *qp, const struct ib_send_wr *wr,
> +			   const struct ib_send_wr **bad_wr)
> +{
> +	struct siw_sqe sqe = {};
> +	int rv = 0;
> +
> +	while (wr) {
> +		sqe.id = wr->wr_id;
> +		sqe.opcode = wr->opcode;
> +		rv = siw_sqe_complete(qp, &sqe, 0, SIW_WC_WR_FLUSH_ERR);
> +		if (rv) {
> +			if (bad_wr)
> +				*bad_wr = wr;
> +			break;
> +		}
> +		wr = wr->next;
> +	}
> +	return rv;
> +}
> +
> +/* Complete RQ WR's without processing */
> +static int siw_rq_flush_wr(struct siw_qp *qp, const struct ib_recv_wr *wr,
> +			   const struct ib_recv_wr **bad_wr)
> +{
> +	struct siw_rqe rqe = {};
> +	int rv = 0;
> +
> +	while (wr) {
> +		rqe.id = wr->wr_id;
> +		rv = siw_rqe_complete(qp, &rqe, 0, 0, SIW_WC_WR_FLUSH_ERR);
> +		if (rv) {
> +			if (bad_wr)
> +				*bad_wr = wr;
> +			break;
> +		}
> +		wr = wr->next;
> +	}
> +	return rv;
> +}
> +
>  /*
>   * siw_post_send()
>   *
> @@ -705,6 +746,12 @@ int siw_post_send(struct ib_qp *base_qp, const struct ib_send_wr *wr,
>  	unsigned long flags;
>  	int rv = 0;
>
> +	if (wr && !qp->kernel_verbs) {

It is not related to this specific patch, but all siw "kernel_verbs"
should go, we have standard way to distinguish between kernel and user
verbs.

Thanks

  reply	other threads:[~2019-10-02 15:47 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-02 14:38 [[PATCH v2 for-next]] RDMA/siw: Fix SQ/RQ drain logic Bernard Metzler
2019-10-02 15:47 ` Leon Romanovsky [this message]
2019-10-04 14:09   ` Bernard Metzler
2019-10-04 17:48     ` Jason Gunthorpe
2019-10-25 12:11       ` Bernard Metzler
2019-10-27  5:21         ` Leon Romanovsky
2019-10-28 12:37           ` Bernard Metzler
2019-10-28 13:43             ` Jason Gunthorpe
2019-10-29  4:54             ` Leon Romanovsky
2019-10-31 13:38               ` Bernard Metzler
2019-10-05  8:26     ` Leon Romanovsky
2019-10-18 13:50       ` Bernard Metzler
2019-10-22  5:49         ` Leon Romanovsky
  -- strict thread matches above, loose matches on Subject: below --
2019-10-02 13:14 Bernard Metzler
2019-10-02 13:32 ` Leon Romanovsky
2019-10-02 14:38   ` 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=20191002154728.GH5855@unreal \
    --to=leon@kernel.org \
    --cc=bharat@chelsio.com \
    --cc=bmt@zurich.ibm.com \
    --cc=bvanassche@acm.org \
    --cc=jgg@ziepe.ca \
    --cc=krishna2@chelsio.com \
    --cc=linux-rdma@vger.kernel.org \
    --cc=nirranjan@chelsio.com \
    /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.