mirror of https://gitee.com/openkylin/linux.git
IB/mlx5: Support extended number of strides for Striding RQ
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>
This commit is contained in:
parent
ff3195b3ed
commit
c16339b69c
|
@ -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 =
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 =
|
||||
|
|
Loading…
Reference in New Issue