@@ -1343,21 +1343,17 @@ static int hns_roce_check_qp_attr(struct ib_qp *ibqp, struct ib_qp_attr *attr,
return 0;
}
-int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
- int attr_mask, struct ib_udata *udata)
+static int check_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
+ int attr_mask, enum ib_qp_state cur_state,
+ enum ib_qp_state new_state)
{
- struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
- enum ib_qp_state cur_state, new_state;
- int ret = -EINVAL;
-
- mutex_lock(&hr_qp->mutex);
-
- if (attr_mask & IB_QP_CUR_STATE && attr->cur_qp_state != hr_qp->state)
- goto out;
+ int ret;
- cur_state = hr_qp->state;
- new_state = attr_mask & IB_QP_STATE ? attr->qp_state : cur_state;
+ if (attr_mask & IB_QP_CUR_STATE && attr->cur_qp_state != hr_qp->state) {
+ ibdev_err(ibqp->device, "failed to check modify curr state\n");
+ return -EINVAL;
+ }
if (ibqp->uobject &&
(attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) {
@@ -1367,19 +1363,41 @@ int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr);
} else {
- ibdev_warn(&hr_dev->ib_dev,
+ ibdev_warn(ibqp->device,
"flush cqe is not supported in userspace!\n");
- goto out;
+ return -EINVAL;
}
}
if (!ib_modify_qp_is_ok(cur_state, new_state, ibqp->qp_type,
attr_mask)) {
- ibdev_err(&hr_dev->ib_dev, "ib_modify_qp_is_ok failed\n");
- goto out;
+ ibdev_err(ibqp->device, "failed to check modify qp state\n");
+ return -EINVAL;
}
ret = hns_roce_check_qp_attr(ibqp, attr, attr_mask);
+ if (ret) {
+ ibdev_err(ibqp->device, "failed to check modify qp attr\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
+ int attr_mask, struct ib_udata *udata)
+{
+ struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
+ struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
+ enum ib_qp_state cur_state, new_state;
+ int ret;
+
+ mutex_lock(&hr_qp->mutex);
+
+ cur_state = hr_qp->state;
+ new_state = attr_mask & IB_QP_STATE ? attr->qp_state : cur_state;
+
+ ret = check_modify_qp(ibqp, attr, attr_mask, cur_state, new_state);
if (ret)
goto out;