IB/mlx5: Support padded 128B CQE feature
In some benchmarks and some CPU architectures, writing the CQE on a full cache line size improves performance by saving memory access operations (read-modify-write) relative to partial cache line change. This patch lets the user to configure the device to pad the CQE up to 128B in case its content is less than 128B. Currently the driver supports only padding for a CQE size of 128B. Signed-off-by: Guy Levi <guyle@mellanox.com> Reviewed-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
@@ -754,13 +754,13 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
int err;
|
||||
|
||||
ucmdlen = udata->inlen < sizeof(ucmd) ?
|
||||
(sizeof(ucmd) - sizeof(ucmd.reserved)) : sizeof(ucmd);
|
||||
(sizeof(ucmd) - sizeof(ucmd.flags)) : sizeof(ucmd);
|
||||
|
||||
if (ib_copy_from_udata(&ucmd, udata, ucmdlen))
|
||||
return -EFAULT;
|
||||
|
||||
if (ucmdlen == sizeof(ucmd) &&
|
||||
ucmd.reserved != 0)
|
||||
(ucmd.flags & ~(MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD)))
|
||||
return -EINVAL;
|
||||
|
||||
if (ucmd.cqe_size != 64 && ucmd.cqe_size != 128)
|
||||
@@ -830,6 +830,19 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
||||
ilog2(ucmd.cqe_comp_res_format));
|
||||
}
|
||||
|
||||
if (ucmd.flags & MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD) {
|
||||
if (*cqe_size != 128 ||
|
||||
!MLX5_CAP_GEN(dev->mdev, cqe_128_always)) {
|
||||
err = -EOPNOTSUPP;
|
||||
mlx5_ib_warn(dev,
|
||||
"CQE padding is not supported for CQE size of %dB!\n",
|
||||
*cqe_size);
|
||||
goto err_cqb;
|
||||
}
|
||||
|
||||
cq->private_flags |= MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_cqb:
|
||||
@@ -989,7 +1002,10 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
cq->cqe_size = cqe_size;
|
||||
|
||||
cqc = MLX5_ADDR_OF(create_cq_in, cqb, cq_context);
|
||||
MLX5_SET(cqc, cqc, cqe_sz, cqe_sz_to_mlx_sz(cqe_size));
|
||||
MLX5_SET(cqc, cqc, cqe_sz,
|
||||
cqe_sz_to_mlx_sz(cqe_size,
|
||||
cq->private_flags &
|
||||
MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD));
|
||||
MLX5_SET(cqc, cqc, log_cq_size, ilog2(entries));
|
||||
MLX5_SET(cqc, cqc, uar_page, index);
|
||||
MLX5_SET(cqc, cqc, c_eqn, eqn);
|
||||
@@ -1339,7 +1355,10 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
|
||||
|
||||
MLX5_SET(cqc, cqc, log_page_size,
|
||||
page_shift - MLX5_ADAPTER_PAGE_SHIFT);
|
||||
MLX5_SET(cqc, cqc, cqe_sz, cqe_sz_to_mlx_sz(cqe_size));
|
||||
MLX5_SET(cqc, cqc, cqe_sz,
|
||||
cqe_sz_to_mlx_sz(cqe_size,
|
||||
cq->private_flags &
|
||||
MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD));
|
||||
MLX5_SET(cqc, cqc, log_cq_size, ilog2(entries));
|
||||
|
||||
MLX5_SET(modify_cq_in, in, op_mod, MLX5_CQ_OPMOD_RESIZE);
|
||||
|
Fai riferimento in un nuovo problema
Block a user