IB/mlx5: Allow scatter to CQE without global signaled WRs
authorYonatan Cohen <yonatanc@mellanox.com>
Tue, 9 Oct 2018 09:05:15 +0000 (12:05 +0300)
committerDoug Ledford <dledford@redhat.com>
Wed, 17 Oct 2018 15:25:41 +0000 (11:25 -0400)
Requester scatter to CQE is restricted to QPs configured to signal
all WRs.

This patch adds ability to enable scatter to cqe (force enable)
in the requester without sig_all, for users who do not want all WRs
signaled but rather just the ones whose data found in the CQE.

Signed-off-by: Yonatan Cohen <yonatanc@mellanox.com>
Reviewed-by: Guy Levi <guyle@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx5/qp.c
include/uapi/rdma/mlx5-abi.h

index 5b1811be6677501d3d7cce7e738d84461ce60971..368728e6f98086ded516c2f4a67b44bee2660db6 100644 (file)
@@ -1706,15 +1706,20 @@ static void configure_responder_scat_cqe(struct ib_qp_init_attr *init_attr,
 
 static void configure_requester_scat_cqe(struct mlx5_ib_dev *dev,
                                         struct ib_qp_init_attr *init_attr,
+                                        struct mlx5_ib_create_qp *ucmd,
                                         void *qpc)
 {
        enum ib_qp_type qpt = init_attr->qp_type;
        int scqe_sz;
+       bool allow_scat_cqe = 0;
 
        if (qpt == IB_QPT_UC || qpt == IB_QPT_UD)
                return;
 
-       if (init_attr->sq_sig_type != IB_SIGNAL_ALL_WR)
+       if (ucmd)
+               allow_scat_cqe = ucmd->flags & MLX5_QP_FLAG_ALLOW_SCATTER_CQE;
+
+       if (!allow_scat_cqe && init_attr->sq_sig_type != IB_SIGNAL_ALL_WR)
                return;
 
        scqe_sz = mlx5_ib_get_cqe_size(init_attr->send_cq);
@@ -1836,7 +1841,8 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
                                              MLX5_QP_FLAG_TUNNEL_OFFLOADS |
                                              MLX5_QP_FLAG_BFREG_INDEX |
                                              MLX5_QP_FLAG_TYPE_DCT |
-                                             MLX5_QP_FLAG_TYPE_DCI))
+                                             MLX5_QP_FLAG_TYPE_DCI |
+                                             MLX5_QP_FLAG_ALLOW_SCATTER_CQE))
                        return -EINVAL;
 
                err = get_qp_user_index(to_mucontext(pd->uobject->context),
@@ -1971,7 +1977,9 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
 
        if (qp->scat_cqe && is_connected(init_attr->qp_type)) {
                configure_responder_scat_cqe(init_attr, qpc);
-               configure_requester_scat_cqe(dev, init_attr, qpc);
+               configure_requester_scat_cqe(dev, init_attr,
+                                            (pd && pd->uobject) ? &ucmd : NULL,
+                                            qpc);
        }
 
        if (qp->rq.wqe_cnt) {
index 6056625237cf99840e92077884d4b199654ded44..8fa9f90e2bb19b9d566d65318a10d994c555cad6 100644 (file)
@@ -47,6 +47,7 @@ enum {
        MLX5_QP_FLAG_TYPE_DCI           = 1 << 5,
        MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC = 1 << 6,
        MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC = 1 << 7,
+       MLX5_QP_FLAG_ALLOW_SCATTER_CQE  = 1 << 8,
 };
 
 enum {