From: Bernard Metzler <bernard.metzler@linux.dev>
To: Ruoyu Wang <ruoyuw560@gmail.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>, Leon Romanovsky <leon@kernel.org>,
linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4] RDMA/siw: publish QP after initialization
Date: Tue, 30 Jun 2026 12:24:12 +0200 [thread overview]
Message-ID: <acd343f9-3a36-4dfc-a9c2-b1d78971a41f@linux.dev> (raw)
In-Reply-To: <20260630060040.966461-1-ruoyuw560@gmail.com>
On 30.06.2026 08:00, Ruoyu Wang wrote:
> siw_create_qp() currently calls siw_qp_add() before the queues, CQ
> pointers, state, completion, and device list entry are ready. A QPN
> lookup can therefore reach a QP that is still being constructed.
>
> Move siw_qp_add() to the end of siw_create_qp(), after QP
> initialization and before adding the QP to the siw device list.
>
> Fixes: f29dd55b0236 ("rdma/siw: queue pair methods")
> Suggested-by: Bernard Metzler <bernard.metzler@linux.dev>
> Signed-off-by: Ruoyu Wang <ruoyuw560@gmail.com>
> ---
> Changes in v4:
> - Move `if (udata->outlen < sizeof(uresp))` into the second `if (udata)`
> clause, right before ib_copy_to_udata() (Bernard Metzler).
> - Move INIT_LIST_HEAD(&qp->devq) to just before spin_lock_irqsave(),
> close to list_add_tail() where it logically belongs (Bernard Metzler).
>
> Changes in v3:
> - Move siw_qp_add()/xa_alloc() to the end of siw_create_qp().
> - Drop the QPN reservation helper from v2.
>
> drivers/infiniband/sw/siw/siw_verbs.c | 57 ++++++++++++++++----------
> 1 file changed, 35 insertions(+), 22 deletions(-)
>
> --- a/drivers/infiniband/sw/siw/siw_verbs.c
> +++ b/drivers/infiniband/sw/siw/siw_verbs.c
> @@ -316,6 +316,7 @@
> struct siw_ucontext *uctx =
> rdma_udata_to_drv_context(udata, struct siw_ucontext,
> base_ucontext);
> + struct siw_uresp_create_qp uresp = {};
> unsigned long flags;
> int num_sqe, num_rqe, rv = 0;
> size_t length;
> @@ -369,11 +370,6 @@
> spin_lock_init(&qp->rq_lock);
> spin_lock_init(&qp->orq_lock);
>
> - rv = siw_qp_add(sdev, qp);
> - if (rv)
> - goto err_atomic;
> -
> -
> /* All queue indices are derived from modulo operations
> * on a free running 'get' (consumer) and 'put' (producer)
> * unsigned counter. Having queue sizes at power of two
> @@ -391,14 +387,14 @@
>
> if (qp->sendq == NULL) {
> rv = -ENOMEM;
> - goto err_out_xa;
> + goto err_out;
> }
> if (attrs->sq_sig_type != IB_SIGNAL_REQ_WR) {
> if (attrs->sq_sig_type == IB_SIGNAL_ALL_WR)
> qp->attrs.flags |= SIW_SIGNAL_ALL_WR;
> else {
> rv = -EINVAL;
> - goto err_out_xa;
> + goto err_out;
> }
> }
> qp->pd = pd;
> @@ -424,7 +420,7 @@
>
> if (qp->recvq == NULL) {
> rv = -ENOMEM;
> - goto err_out_xa;
> + goto err_out;
> }
> qp->attrs.rq_size = num_rqe;
> }
> @@ -439,11 +435,8 @@
> qp->attrs.state = SIW_QP_STATE_IDLE;
>
> if (udata) {
> - struct siw_uresp_create_qp uresp = {};
> -
> uresp.num_sqe = num_sqe;
> uresp.num_rqe = num_rqe;
> - uresp.qp_id = qp_id(qp);
>
> if (qp->sendq) {
> length = num_sqe * sizeof(struct siw_sqe);
> @@ -452,7 +445,7 @@
> length, &uresp.sq_key);
> if (!qp->sq_entry) {
> rv = -ENOMEM;
> - goto err_out_xa;
> + goto err_out;
> }
> }
>
> @@ -464,9 +457,23 @@
> if (!qp->rq_entry) {
> uresp.sq_key = SIW_INVAL_UOBJ_KEY;
> rv = -ENOMEM;
> - goto err_out_xa;
> + goto err_out;
> }
> }
> + }
> + qp->tx_cpu = siw_get_tx_cpu(sdev);
> + if (qp->tx_cpu < 0) {
> + rv = -EINVAL;
> + goto err_out;
> + }
> + init_completion(&qp->qp_free);
> +
> + rv = siw_qp_add(sdev, qp);
> + if (rv)
> + goto err_out_tx;
> +
> + if (udata) {
> + uresp.qp_id = qp_id(qp);
>
> if (udata->outlen < sizeof(uresp)) {
> rv = -EINVAL;
> @@ -476,22 +483,19 @@
> if (rv)
> goto err_out_xa;
> }
> - qp->tx_cpu = siw_get_tx_cpu(sdev);
> - if (qp->tx_cpu < 0) {
> - rv = -EINVAL;
> - goto err_out_xa;
> - }
> +
> INIT_LIST_HEAD(&qp->devq);
> spin_lock_irqsave(&sdev->lock, flags);
> list_add_tail(&qp->devq, &sdev->qp_list);
> spin_unlock_irqrestore(&sdev->lock, flags);
>
> - init_completion(&qp->qp_free);
> -
> return 0;
>
> err_out_xa:
> xa_erase(&sdev->qp_xa, qp_id(qp));
> +err_out_tx:
> + siw_put_tx_cpu(qp->tx_cpu);
> +err_out:
> if (uctx) {
> rdma_user_mmap_entry_remove(qp->sq_entry);
> rdma_user_mmap_entry_remove(qp->rq_entry);
>
Thanks Ruoyu, that looks good.
Acked-by: Bernard Metzler <bernard.metzler@linux.dev>
prev parent reply other threads:[~2026-06-30 10:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-30 6:00 [PATCH v4] RDMA/siw: publish QP after initialization Ruoyu Wang
2026-06-30 10:24 ` Bernard Metzler [this message]
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=acd343f9-3a36-4dfc-a9c2-b1d78971a41f@linux.dev \
--to=bernard.metzler@linux.dev \
--cc=jgg@ziepe.ca \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=ruoyuw560@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox