From: Leon Romanovsky <leon@kernel.org>
To: Zhu Yanjun <yanjun.zhu@linux.dev>
Cc: Selvin Xavier <selvin.xavier@broadcom.com>,
jgg@ziepe.ca, linux-rdma@vger.kernel.org,
andrew.gospodarek@broadcom.com,
Hongguang Gao <hong``guang.gao@broadcom.com>
Subject: Re: [PATCH for-next 2/4] RDMA/bnxt_re: Get the WQE index from slot index while completing the WQEs
Date: Mon, 12 Aug 2024 13:08:18 +0300 [thread overview]
Message-ID: <20240812100818.GB12060@unreal> (raw)
In-Reply-To: <bda30518-00cf-43eb-a463-e4b7ce7057d8@linux.dev>
On Mon, Aug 12, 2024 at 04:48:44PM +0800, Zhu Yanjun wrote:
> 在 2024/8/11 3:19, Selvin Xavier 写道:
> > While reporting the completions, SQ Work Queue index is required to
> > identify the WQE that generated the completions. In variable WQE mode,
> > FW returns the slot index for Error completions. Driver need to walk
> > through the shadow queue between the consumer index and producer index
> > and matches the slot index returned by FW. If a match is found, the next
> > index of the shadow queue is the WQE index to be considered for remaining
> > poll_cq loop.
> >
> > Signed-off-by: Hongguang Gao <hong``guang.gao@broadcom.com>
> > Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> > ---
> > drivers/infiniband/hw/bnxt_re/qplib_fp.c | 40 ++++++++++++++++++++++++++++++++
> > drivers/infiniband/hw/bnxt_re/qplib_fp.h | 10 ++++++++
> > 2 files changed, 50 insertions(+)
> >
> > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> > index 0af09e7..b49f49c 100644
> > --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> > +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
> > @@ -2471,6 +2471,32 @@ static int do_wa9060(struct bnxt_qplib_qp *qp, struct bnxt_qplib_cq *cq,
> > return rc;
> > }
> > +static int bnxt_qplib_get_cqe_sq_cons(struct bnxt_qplib_q *sq, u32 cqe_slot)
> > +{
> > + struct bnxt_qplib_hwq *sq_hwq;
> > + struct bnxt_qplib_swq *swq;
> > + int cqe_sq_cons = -1;
> > + u32 start, last;
> > +
> > + sq_hwq = &sq->hwq;
> > +
> > + start = sq->swq_start;
> > + last = sq->swq_last;
> > +
> > + while (last != start) {
> > + swq = &sq->swq[last];
> > + if (swq->slot_idx == cqe_slot) {
> > + cqe_sq_cons = swq->next_idx;
> > + dev_err(&sq_hwq->pdev->dev, "%s: Found cons wqe = %d slot = %d\n",
> > + __func__, cqe_sq_cons, cqe_slot);
> > + break;
> > + }
> > +
> > + last = swq->next_idx;
> > + }
> > + return cqe_sq_cons;
> > +}
> > +
> > static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq,
> > struct cq_req *hwcqe,
> > struct bnxt_qplib_cqe **pcqe, int *budget,
> > @@ -2481,6 +2507,7 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq,
> > struct bnxt_qplib_qp *qp;
> > struct bnxt_qplib_q *sq;
> > u32 cqe_sq_cons;
> > + int cqe_cons;
> > int rc = 0;
> > qp = (struct bnxt_qplib_qp *)((unsigned long)
> > @@ -2498,6 +2525,19 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq,
> > "%s: QP in Flush QP = %p\n", __func__, qp);
> > goto done;
> > }
> > +
> > + if (__is_err_cqe_for_var_wqe(qp, hwcqe->status)) {
> > + cqe_cons = bnxt_qplib_get_cqe_sq_cons(sq, hwcqe->sq_cons_idx);
> > + if (cqe_cons < 0) {
> > + dev_err(&cq->hwq.pdev->dev, "%s: Wrong SQ cons cqe_slot_indx = %d\n",
> > + __func__, hwcqe->sq_cons_idx);
> > + goto done;
> > + }
> > + cqe_sq_cons = cqe_cons;
> > + dev_err(&cq->hwq.pdev->dev, "%s: cqe_sq_cons = %d swq_last = %d swq_start = %d\n",
> > + __func__, cqe_sq_cons, sq->swq_last, sq->swq_start);
> > + }
> > +
> > /* Require to walk the sq's swq to fabricate CQEs for all previously
> > * signaled SWQEs due to CQE aggregation from the current sq cons
> > * to the cqe_sq_cons
> > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
> > index f54d7a0..2e7a4fd 100644
> > --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
> > +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
> > @@ -649,4 +649,14 @@ static inline __le64 bnxt_re_update_msn_tbl(u32 st_idx, u32 npsn, u32 start_psn)
> > (((start_psn) << SQ_MSN_SEARCH_START_PSN_SFT) &
> > SQ_MSN_SEARCH_START_PSN_MASK));
> > }
> > +
> > +static inline bool __is_var_wqe(struct bnxt_qplib_qp *qp)
>
> IIRC, inline is not needed here. The compiler will determine if the function
> inline is needed or not.
Selvin added inline functions to *.h file and not to *.c file.
Thanks
>
> It is a trivial problem.
>
> Zhu Yanjun
>
> > +{
> > + return (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_VARIABLE);
> > +}
> > +
> > +static inline bool __is_err_cqe_for_var_wqe(struct bnxt_qplib_qp *qp, u8 status)
>
> ditto.
>
> > +{
> > + return (status != CQ_REQ_STATUS_OK) && __is_var_wqe(qp);
> > +}
> > #endif /* __BNXT_QPLIB_FP_H__ */
>
next prev parent reply other threads:[~2024-08-12 10:08 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-10 19:19 [PATCH for-next 0/4] RDMA/bnxt_re: Use variable size Work Queue entry for Gen P7 adapters Selvin Xavier
2024-08-10 19:19 ` [PATCH for-next 1/4] RDMA/bnxt_re: Add support for Variable WQE in Genp7 adapters Selvin Xavier
2024-08-10 19:19 ` [PATCH for-next 2/4] RDMA/bnxt_re: Get the WQE index from slot index while completing the WQEs Selvin Xavier
2024-08-12 8:48 ` Zhu Yanjun
2024-08-12 10:08 ` Leon Romanovsky [this message]
2024-08-12 10:45 ` Zhu Yanjun
2024-08-10 19:19 ` [PATCH for-next 3/4] RDMA/bnxt_re: Handle variable WQE support for user applications Selvin Xavier
2024-08-10 19:19 ` [PATCH for-next 4/4] RDMA/bnxt_re: Enable variable size WQEs for user space applications Selvin Xavier
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=20240812100818.GB12060@unreal \
--to=leon@kernel.org \
--cc=andrew.gospodarek@broadcom.com \
--cc=hong``guang.gao@broadcom.com \
--cc=jgg@ziepe.ca \
--cc=linux-rdma@vger.kernel.org \
--cc=selvin.xavier@broadcom.com \
--cc=yanjun.zhu@linux.dev \
/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