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,7 +1149,13 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
|
||||||
MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES;
|
MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES;
|
||||||
resp.striding_rq_caps.max_single_stride_log_num_of_bytes =
|
resp.striding_rq_caps.max_single_stride_log_num_of_bytes =
|
||||||
MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES;
|
MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES;
|
||||||
resp.striding_rq_caps.min_single_wqe_log_num_of_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;
|
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES;
|
||||||
resp.striding_rq_caps.max_single_wqe_log_num_of_strides =
|
resp.striding_rq_caps.max_single_wqe_log_num_of_strides =
|
||||||
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES;
|
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES;
|
||||||
|
|
|
@ -291,6 +291,7 @@ enum mlx5_ib_wq_flags {
|
||||||
#define MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES 16
|
#define MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES 16
|
||||||
#define MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES 6
|
#define MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES 6
|
||||||
#define MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES 13
|
#define MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES 13
|
||||||
|
#define MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES 3
|
||||||
|
|
||||||
struct mlx5_ib_rwq {
|
struct mlx5_ib_rwq {
|
||||||
struct ib_wq ibwq;
|
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);
|
MLX5_SET(wq, wq, log_wq_stride, rwq->log_rq_stride);
|
||||||
if (rwq->create_flags & MLX5_IB_WQ_FLAGS_STRIDING_RQ) {
|
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, two_byte_shift_en, rwq->two_byte_shift_en);
|
||||||
MLX5_SET(wq, wq, log_wqe_stride_size,
|
MLX5_SET(wq, wq, log_wqe_stride_size,
|
||||||
rwq->single_stride_log_num_of_bytes -
|
rwq->single_stride_log_num_of_bytes -
|
||||||
MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES);
|
MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES);
|
||||||
MLX5_SET(wq, wq, log_wqe_num_of_strides, rwq->log_num_strides -
|
MLX5_SET(wq, wq, log_wqe_num_of_strides,
|
||||||
MLX5_MIN_SINGLE_WQE_LOG_NUM_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, log_wq_sz, rwq->log_rq_size);
|
||||||
MLX5_SET(wq, wq, pd, to_mpd(pd)->pdn);
|
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;
|
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,
|
static int prepare_user_rq(struct ib_pd *pd,
|
||||||
struct ib_wq_init_attr *init_attr,
|
struct ib_wq_init_attr *init_attr,
|
||||||
struct ib_udata *udata,
|
struct ib_udata *udata,
|
||||||
|
@ -6084,12 +6106,14 @@ static int prepare_user_rq(struct ib_pd *pd,
|
||||||
MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES);
|
MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if ((ucmd.single_wqe_log_num_of_strides >
|
if (!log_of_strides_valid(dev,
|
||||||
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES) ||
|
ucmd.single_wqe_log_num_of_strides)) {
|
||||||
(ucmd.single_wqe_log_num_of_strides <
|
mlx5_ib_dbg(
|
||||||
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES)) {
|
dev,
|
||||||
mlx5_ib_dbg(dev, "Invalid log num strides (%u. Range is %u - %u)\n",
|
"Invalid log num strides (%u. Range is %u - %u)\n",
|
||||||
ucmd.single_wqe_log_num_of_strides,
|
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_MIN_SINGLE_WQE_LOG_NUM_STRIDES,
|
||||||
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES);
|
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
Loading…
Reference in New Issue