RDMA/hns: Simplify the status judgment code of hns_roce_v1_m_qp()
authorLang Cheng <chenglang@huawei.com>
Wed, 15 Apr 2020 08:14:35 +0000 (16:14 +0800)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 24 Apr 2020 13:19:11 +0000 (10:19 -0300)
Use status table to reduce cyclomatic complexity.

Link: https://lore.kernel.org/r/1586938475-37049-7-git-send-email-liweihang@huawei.com
Signed-off-by: Lang Cheng <chenglang@huawei.com>
Signed-off-by: Weihang Li <liweihang@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hns/hns_roce_hw_v1.c

index a1f053c..49775cd 100644 (file)
@@ -2720,6 +2720,28 @@ out:
        return -EINVAL;
 }
 
+static bool check_qp_state(enum ib_qp_state cur_state,
+                          enum ib_qp_state new_state)
+{
+       static const bool sm[][IB_QPS_ERR + 1] = {
+               [IB_QPS_RESET] = { [IB_QPS_RESET] = true,
+                                  [IB_QPS_INIT] = true },
+               [IB_QPS_INIT] = { [IB_QPS_RESET] = true,
+                                 [IB_QPS_INIT] = true,
+                                 [IB_QPS_RTR] = true,
+                                 [IB_QPS_ERR] = true },
+               [IB_QPS_RTR] = { [IB_QPS_RESET] = true,
+                                [IB_QPS_RTS] = true,
+                                [IB_QPS_ERR] = true },
+               [IB_QPS_RTS] = { [IB_QPS_RESET] = true, [IB_QPS_ERR] = true },
+               [IB_QPS_SQD] = {},
+               [IB_QPS_SQE] = {},
+               [IB_QPS_ERR] = { [IB_QPS_RESET] = true, [IB_QPS_ERR] = true }
+       };
+
+       return sm[cur_state][new_state];
+}
+
 static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
                            int attr_mask, enum ib_qp_state cur_state,
                            enum ib_qp_state new_state)
@@ -2741,6 +2763,13 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
        u8 *dmac;
        u8 *smac;
 
+       if (!check_qp_state(cur_state, new_state)) {
+               ibdev_err(ibqp->device,
+                         "not support QP(%u) status from %d to %d\n",
+                         ibqp->qp_num, cur_state, new_state);
+               return -EINVAL;
+       }
+
        context = kzalloc(sizeof(*context), GFP_KERNEL);
        if (!context)
                return -ENOMEM;
@@ -3072,8 +3101,7 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
                               QP_CONTEXT_QPC_BYTES_156_SL_S,
                               rdma_ah_get_sl(&attr->ah_attr));
                hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr);
-       } else if (cur_state == IB_QPS_RTR &&
-               new_state == IB_QPS_RTS) {
+       } else if (cur_state == IB_QPS_RTR && new_state == IB_QPS_RTS) {
                /* If exist optional param, return error */
                if ((attr_mask & IB_QP_ALT_PATH) ||
                    (attr_mask & IB_QP_ACCESS_FLAGS) ||
@@ -3245,16 +3273,6 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
                               QP_CONTEXT_QPC_BYTES_188_TX_RETRY_CUR_INDEX_M,
                               QP_CONTEXT_QPC_BYTES_188_TX_RETRY_CUR_INDEX_S,
                               0);
-       } else if (!((cur_state == IB_QPS_INIT && new_state == IB_QPS_RESET) ||
-                  (cur_state == IB_QPS_INIT && new_state == IB_QPS_ERR) ||
-                  (cur_state == IB_QPS_RTR && new_state == IB_QPS_RESET) ||
-                  (cur_state == IB_QPS_RTR && new_state == IB_QPS_ERR) ||
-                  (cur_state == IB_QPS_RTS && new_state == IB_QPS_RESET) ||
-                  (cur_state == IB_QPS_RTS && new_state == IB_QPS_ERR) ||
-                  (cur_state == IB_QPS_ERR && new_state == IB_QPS_RESET) ||
-                  (cur_state == IB_QPS_ERR && new_state == IB_QPS_ERR))) {
-               dev_err(dev, "not support this status migration\n");
-               goto out;
        }
 
        /* Every status migrate must change state */