| 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; |