RDMA/hns: Bugfix for mapping user db [Linux 5.1]

RDMA/hns: Bugfix for mapping user db [Linux 5.1]

This Linux kernel change "RDMA/hns: Bugfix for mapping user db" is included in the Linux 5.1 release. This change is authored by Lijun Ou <oulijun [at] huawei.com> on Tue Apr 23 17:30:26 2019 +0800. The commit for this change in Linux stable tree is 2557fab (patch).

RDMA/hns: Bugfix for mapping user db

When the maximum send wr delivered by the user is zero, the qp does not
have a sq.

When allocating the sq db buffer to store the user sq pi pointer and map
it to the kernel mode, max_send_wr is used as the trigger condition, while
the kernel does not consider the max_send_wr trigger condition when
mapmping db. It will cause sq record doorbell map fail and create qp fail.

The failed print information as follows:

 hns3 0000:7d:00.1: Send cmd: tail - 418, opcode - 0x8504, flag - 0x0011, retval - 0x0000
 hns3 0000:7d:00.1: Send cmd: 0xe59dc000 0x00000000 0x00000000 0x00000000 0x00000116 0x0000ffff
 hns3 0000:7d:00.1: sq record doorbell map failed!
 hns3 0000:7d:00.1: Create RC QP failed

Fixes: 0425e3e6e0c7 ("RDMA/hns: Support flush cqe for hip08 in kernel space")
Signed-off-by: Lijun Ou <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>

There are 2 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
index 66cdf62..60cf9f0 100644
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -533,7 +533,7 @@ static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev,

 static int hns_roce_qp_has_sq(struct ib_qp_init_attr *attr)
 {
-   if (attr->qp_type == IB_QPT_XRC_TGT)
+   if (attr->qp_type == IB_QPT_XRC_TGT || !attr->cap.max_send_wr)
        return 0;

    return 1;

Leave a Reply

Your email address will not be published. Required fields are marked *