[PATCH rdma-next v2 05/10] RDMA/mana_ib: Post receive WRs on kernel RC QPs
From: Konstantin Taranov
Date: Sat Oct 03 2026 - 02:44:37 EST
From: Konstantin Taranov <kotaranov@xxxxxxxxxxxxx>
Implement receive request posting for RC QPs. When posting a batch of
WRs, ring the doorbell periodically to prevent the u8 counter from
overflowing.
Signed-off-by: Konstantin Taranov <kotaranov@xxxxxxxxxxxxx>
---
drivers/infiniband/hw/mana/wr.c | 37 +++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/drivers/infiniband/hw/mana/wr.c b/drivers/infiniband/hw/mana/wr.c
index 250d673f58f2..5d42af91fce4 100644
--- a/drivers/infiniband/hw/mana/wr.c
+++ b/drivers/infiniband/hw/mana/wr.c
@@ -70,6 +70,41 @@ static int mana_ib_post_recv_ud(struct mana_ib_qp *qp, const struct ib_recv_wr *
return err;
}
+static int mana_ib_post_recv_rc(struct mana_ib_qp *qp, const struct ib_recv_wr *wr,
+ const struct ib_recv_wr **bad_wr)
+{
+ struct mana_ib_dev *mdev = container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
+ struct mana_ib_queue *ib_rq = mana_qp_get_rq(qp);
+ unsigned long flags;
+ u8 wqe_cnt = 0;
+ int err = 0;
+
+ spin_lock_irqsave(&qp->rq_lock, flags);
+
+ for (; wr; wr = wr->next) {
+ err = mana_ib_post_rq(qp, wr);
+ if (unlikely(err)) {
+ *bad_wr = wr;
+ break;
+ }
+ wqe_cnt++;
+ if (wqe_cnt == 0xFF) {
+ mana_gd_wq_ring_doorbell_ext(mdev_to_gc(mdev), ib_rq->kmem,
+ ib_rq->kmem->head * GDMA_WQE_BU_SIZE,
+ wqe_cnt, 0);
+ wqe_cnt = 0;
+ }
+ }
+
+ if (wqe_cnt)
+ mana_gd_wq_ring_doorbell_ext(mdev_to_gc(mdev), ib_rq->kmem,
+ ib_rq->kmem->head * GDMA_WQE_BU_SIZE,
+ wqe_cnt, 0);
+
+ spin_unlock_irqrestore(&qp->rq_lock, flags);
+ return err;
+}
+
int mana_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
const struct ib_recv_wr **bad_wr)
{
@@ -79,6 +114,8 @@ int mana_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
case IB_QPT_UD:
case IB_QPT_GSI:
return mana_ib_post_recv_ud(qp, wr, bad_wr);
+ case IB_QPT_RC:
+ return mana_ib_post_recv_rc(qp, wr, bad_wr);
default:
/* Unsupported QP type */
*bad_wr = wr;
--
2.43.0