RDMA/mlx5: Initialize QP mutex for the debug kernels
[sfrench/cifs-2.6.git] / drivers / infiniband / hw / mlx5 / qp.c
index e050eade97a1e53f541a4ca76be43dd0462fab97..1225b8d77510f70d8dd503abeb8312e6ee0148c7 100644 (file)
@@ -1766,15 +1766,14 @@ err:
 }
 
 static void configure_requester_scat_cqe(struct mlx5_ib_dev *dev,
+                                        struct mlx5_ib_qp *qp,
                                         struct ib_qp_init_attr *init_attr,
-                                        struct mlx5_ib_create_qp *ucmd,
                                         void *qpc)
 {
        int scqe_sz;
        bool allow_scat_cqe = false;
 
-       if (ucmd)
-               allow_scat_cqe = ucmd->flags & MLX5_QP_FLAG_ALLOW_SCATTER_CQE;
+       allow_scat_cqe = qp->flags_en & MLX5_QP_FLAG_ALLOW_SCATTER_CQE;
 
        if (!allow_scat_cqe && init_attr->sq_sig_type != IB_SIGNAL_ALL_WR)
                return;
@@ -1853,8 +1852,6 @@ static int create_xrc_tgt_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
        u32 *in;
        int err;
 
-       mutex_init(&qp->mutex);
-
        if (attr->sq_sig_type == IB_SIGNAL_ALL_WR)
                qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE;
 
@@ -1938,7 +1935,6 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
        u32 *in;
        int err;
 
-       mutex_init(&qp->mutex);
        spin_lock_init(&qp->sq.lock);
        spin_lock_init(&qp->rq.lock);
 
@@ -2012,7 +2008,7 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
        }
        if ((qp->flags_en & MLX5_QP_FLAG_SCATTER_CQE) &&
            (qp->type == MLX5_IB_QPT_DCI || qp->type == IB_QPT_RC))
-               configure_requester_scat_cqe(dev, init_attr, ucmd, qpc);
+               configure_requester_scat_cqe(dev, qp, init_attr, qpc);
 
        if (qp->rq.wqe_cnt) {
                MLX5_SET(qpc, qpc, log_rq_stride, qp->rq.wqe_shift - 4);
@@ -2129,7 +2125,6 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
        u32 *in;
        int err;
 
-       mutex_init(&qp->mutex);
        spin_lock_init(&qp->sq.lock);
        spin_lock_init(&qp->rq.lock);
 
@@ -2543,13 +2538,18 @@ static void process_vendor_flag(struct mlx5_ib_dev *dev, int *flags, int flag,
                return;
        }
 
-       if (flag == MLX5_QP_FLAG_SCATTER_CQE) {
+       switch (flag) {
+       case MLX5_QP_FLAG_SCATTER_CQE:
+       case MLX5_QP_FLAG_ALLOW_SCATTER_CQE:
                /*
-                * We don't return error if this flag was provided,
-                * and mlx5 doesn't have right capability.
-                */
-               *flags &= ~MLX5_QP_FLAG_SCATTER_CQE;
+                        * We don't return error if these flags were provided,
+                        * and mlx5 doesn't have right capability.
+                        */
+               *flags &= ~(MLX5_QP_FLAG_SCATTER_CQE |
+                           MLX5_QP_FLAG_ALLOW_SCATTER_CQE);
                return;
+       default:
+               break;
        }
        mlx5_ib_dbg(dev, "Vendor create QP flag 0x%X is not supported\n", flag);
 }
@@ -2589,6 +2589,8 @@ static int process_vendor_flags(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
        process_vendor_flag(dev, &flags, MLX5_QP_FLAG_SIGNATURE, true, qp);
        process_vendor_flag(dev, &flags, MLX5_QP_FLAG_SCATTER_CQE,
                            MLX5_CAP_GEN(mdev, sctr_data_cqe), qp);
+       process_vendor_flag(dev, &flags, MLX5_QP_FLAG_ALLOW_SCATTER_CQE,
+                           MLX5_CAP_GEN(mdev, sctr_data_cqe), qp);
 
        if (qp->type == IB_QPT_RAW_PACKET) {
                cond = MLX5_CAP_ETH(mdev, tunnel_stateless_vxlan) ||
@@ -2963,6 +2965,7 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attr,
                goto free_ucmd;
        }
 
+       mutex_init(&qp->mutex);
        qp->type = type;
        if (udata) {
                err = process_vendor_flags(dev, qp, params.ucmd, attr);