RDMA/hns: Fix the bug with updating rq head pointer when flush cqe
authorLijun Ou <oulijun@huawei.com>
Wed, 12 Dec 2018 09:49:06 +0000 (17:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2019 08:21:21 +0000 (09:21 +0100)
[ Upstream commit 9c6ccc035c209dda07685e8dba829a203ba17499 ]

When flush cqe with srq, the driver disable to update the rq head pointer
into the hardware.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index 9e7923c..1eda8a2 100644 (file)
@@ -3503,13 +3503,16 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                roce_set_field(qpc_mask->byte_160_sq_ci_pi,
                               V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
                               V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0);
-               roce_set_field(context->byte_84_rq_ci_pi,
+
+               if (!ibqp->srq) {
+                       roce_set_field(context->byte_84_rq_ci_pi,
                               V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
                               V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S,
                               hr_qp->rq.head);
-               roce_set_field(qpc_mask->byte_84_rq_ci_pi,
+                       roce_set_field(qpc_mask->byte_84_rq_ci_pi,
                               V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
                               V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0);
+               }
        }
 
        if (attr_mask & IB_QP_AV) {
@@ -3971,7 +3974,8 @@ static void hns_roce_set_qps_to_err(struct hns_roce_dev *hr_dev, u32 qpn)
        if (hr_qp->ibqp.uobject) {
                if (hr_qp->sdb_en == 1) {
                        hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr);
-                       hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr);
+                       if (hr_qp->rdb_en == 1)
+                               hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr);
                } else {
                        dev_warn(hr_dev->dev, "flush cqe is unsupported in userspace!\n");
                        return;