IB/mlx5: Support extended number of strides for Striding RQ
authorMark Zhang <markz@mellanox.com>
Fri, 15 Nov 2019 15:45:55 +0000 (17:45 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 19 Nov 2019 20:05:41 +0000 (16:05 -0400)
Extends the minimum single WQE strides from 64 to 8, which is exposed
by the "min_single_wqe_log_num_of_strides" field of striding_rq_caps.
Choose right number of strides based on FW capability.

Link: https://lore.kernel.org/r/20191115154555.247856-1-leon@kernel.org
Signed-off-by: Mark Zhang <markz@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/qp.c

index 2a510de..4ced721 100644 (file)
@@ -1149,8 +1149,14 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
                                MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES;
                        resp.striding_rq_caps.max_single_stride_log_num_of_bytes =
                                MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES;
-                       resp.striding_rq_caps.min_single_wqe_log_num_of_strides =
-                               MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES;
+                       if (MLX5_CAP_GEN(dev->mdev, ext_stride_num_range))
+                               resp.striding_rq_caps
+                                       .min_single_wqe_log_num_of_strides =
+                                       MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES;
+                       else
+                               resp.striding_rq_caps
+                                       .min_single_wqe_log_num_of_strides =
+                                       MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES;
                        resp.striding_rq_caps.max_single_wqe_log_num_of_strides =
                                MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES;
                        resp.striding_rq_caps.supported_qpts =
index d14fe43..5e826eb 100644 (file)
@@ -291,6 +291,7 @@ enum mlx5_ib_wq_flags {
 #define MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES 16
 #define MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES 6
 #define MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES 13
+#define MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES 3
 
 struct mlx5_ib_rwq {
        struct ib_wq            ibwq;
index 26fb022..82814c6 100644 (file)
@@ -5957,12 +5957,21 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
        }
        MLX5_SET(wq, wq, log_wq_stride, rwq->log_rq_stride);
        if (rwq->create_flags & MLX5_IB_WQ_FLAGS_STRIDING_RQ) {
+               /*
+                * In Firmware number of strides in each WQE is:
+                *   "512 * 2^single_wqe_log_num_of_strides"
+                * Values 3 to 8 are accepted as 10 to 15, 9 to 18 are
+                * accepted as 0 to 9
+                */
+               static const u8 fw_map[] = { 10, 11, 12, 13, 14, 15, 0, 1,
+                                            2,  3,  4,  5,  6,  7,  8, 9 };
                MLX5_SET(wq, wq, two_byte_shift_en, rwq->two_byte_shift_en);
                MLX5_SET(wq, wq, log_wqe_stride_size,
                         rwq->single_stride_log_num_of_bytes -
                         MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES);
-               MLX5_SET(wq, wq, log_wqe_num_of_strides, rwq->log_num_strides -
-                        MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES);
+               MLX5_SET(wq, wq, log_wqe_num_of_strides,
+                        fw_map[rwq->log_num_strides -
+                               MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES]);
        }
        MLX5_SET(wq, wq, log_wq_sz, rwq->log_rq_size);
        MLX5_SET(wq, wq, pd, to_mpd(pd)->pdn);
@@ -6037,6 +6046,19 @@ static int set_user_rq_size(struct mlx5_ib_dev *dev,
        return 0;
 }
 
+static bool log_of_strides_valid(struct mlx5_ib_dev *dev, u32 log_num_strides)
+{
+       if ((log_num_strides > MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES) ||
+           (log_num_strides < MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES))
+               return false;
+
+       if (!MLX5_CAP_GEN(dev->mdev, ext_stride_num_range) &&
+           (log_num_strides < MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES))
+               return false;
+
+       return true;
+}
+
 static int prepare_user_rq(struct ib_pd *pd,
                           struct ib_wq_init_attr *init_attr,
                           struct ib_udata *udata,
@@ -6084,14 +6106,16 @@ static int prepare_user_rq(struct ib_pd *pd,
                                    MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES);
                        return -EINVAL;
                }
-               if ((ucmd.single_wqe_log_num_of_strides >
-                   MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES) ||
-                    (ucmd.single_wqe_log_num_of_strides <
-                       MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES)) {
-                       mlx5_ib_dbg(dev, "Invalid log num strides (%u. Range is %u - %u)\n",
-                                   ucmd.single_wqe_log_num_of_strides,
-                                   MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES,
-                                   MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES);
+               if (!log_of_strides_valid(dev,
+                                         ucmd.single_wqe_log_num_of_strides)) {
+                       mlx5_ib_dbg(
+                               dev,
+                               "Invalid log num strides (%u. Range is %u - %u)\n",
+                               ucmd.single_wqe_log_num_of_strides,
+                               MLX5_CAP_GEN(dev->mdev, ext_stride_num_range) ?
+                                       MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES :
+                                       MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES,
+                               MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES);
                        return -EINVAL;
                }
                rwq->single_stride_log_num_of_bytes =