blob: ee9e841b10353e75bd364c7d6212fae1e41943e4 [file] [log] [blame]
From: Konstantin Taranov <kotaranov@microsoft.com>
Date: Wed, 31 Jul 2024 11:05:53 +0200
Subject: providers/mana: Fix modify RC QPs for RTS and INIT states
Reset RC QP state on RESET as user can submit
receive request during INIT state.
Use attr->sq_psn only when IBV_QP_SQ_PSN is specified.
Fixes: 166c46bc7bbd ("providers/mana: Implement modify QP state")
Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
Origin: upstream, https://github.com/linux-rdma/rdma-core/pull/1556
---
providers/mana/qp.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/providers/mana/qp.c b/providers/mana/qp.c
index a318620..4591cee 100644
--- a/providers/mana/qp.c
+++ b/providers/mana/qp.c
@@ -347,22 +347,24 @@ static void mana_ib_modify_rc_qp(struct mana_qp *qp, struct ibv_qp_attr *attr, i
switch (attr->qp_state) {
case IBV_QPS_RESET:
- case IBV_QPS_INIT:
for (i = 0; i < USER_RC_QUEUE_TYPE_MAX; ++i) {
qp->rc_qp.queues[i].prod_idx = 0;
qp->rc_qp.queues[i].cons_idx = 0;
}
mana_ib_reset_rb_shmem(qp);
reset_shadow_queue(&qp->shadow_rq);
+ reset_shadow_queue(&qp->shadow_sq);
+ case IBV_QPS_INIT:
break;
case IBV_QPS_RTR:
break;
case IBV_QPS_RTS:
- reset_shadow_queue(&qp->shadow_sq);
- qp->rc_qp.sq_ssn = 1;
- qp->rc_qp.sq_psn = attr->sq_psn;
- qp->rc_qp.sq_highest_completed_psn = PSN_DEC(attr->sq_psn);
- gdma_arm_normal_cqe(&qp->rc_qp.queues[USER_RC_RECV_QUEUE_REQUESTER], attr->sq_psn);
+ if (attr_mask & IBV_QP_SQ_PSN) {
+ qp->rc_qp.sq_ssn = 1;
+ qp->rc_qp.sq_psn = attr->sq_psn;
+ qp->rc_qp.sq_highest_completed_psn = PSN_DEC(attr->sq_psn);
+ gdma_arm_normal_cqe(&qp->rc_qp.queues[USER_RC_RECV_QUEUE_REQUESTER], attr->sq_psn);
+ }
break;
default:
break;