From: Zhu Yanjun <yanjun.zhu@linux.dev>
To: Leon Romanovsky <leon@kernel.org>
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 18:45:38 +0800 [thread overview]
Message-ID: <ec209630-97a9-490b-980f-570136f62f6a@linux.dev> (raw)
In-Reply-To: <20240812100818.GB12060@unreal>
在 2024/8/12 18:08, Leon Romanovsky 写道:
> 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.
Yeah. I mistook that these 2 functions were in *.c file.
Thanks.
Zhu Yanjun
>
> 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__ */
--
Best Regards,
Yanjun.Zhu
next prev parent reply other threads:[~2024-08-12 10:45 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
2024-08-12 10:45 ` Zhu Yanjun [this message]
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=ec209630-97a9-490b-980f-570136f62f6a@linux.dev \
--to=yanjun.zhu@linux.dev \
--cc=andrew.gospodarek@broadcom.com \
--cc=hong``guang.gao@broadcom.com \
--cc=jgg@ziepe.ca \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=selvin.xavier@broadcom.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