Commit e1e66cc2 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Roland Dreier

IB/mlx5: Initialize mlx5_ib_qp signature-related members

If user requested signature enable we initialize relevant mlx5_ib_qp
members.  We mark the qp as sig_enable and we increase the effective
SQ size, but still limit the user max_send_wr to original size
computed.  We also allow the create_qp routine to accept sig_enable
create flag.
Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 3121e3c4
...@@ -189,6 +189,9 @@ struct mlx5_ib_qp { ...@@ -189,6 +189,9 @@ struct mlx5_ib_qp {
int create_type; int create_type;
u32 pa_lkey; u32 pa_lkey;
/* Store signature errors */
bool signature_en;
}; };
struct mlx5_ib_cq_buf { struct mlx5_ib_cq_buf {
......
...@@ -256,8 +256,11 @@ static int calc_send_wqe(struct ib_qp_init_attr *attr) ...@@ -256,8 +256,11 @@ static int calc_send_wqe(struct ib_qp_init_attr *attr)
} }
size += attr->cap.max_send_sge * sizeof(struct mlx5_wqe_data_seg); size += attr->cap.max_send_sge * sizeof(struct mlx5_wqe_data_seg);
if (attr->create_flags & IB_QP_CREATE_SIGNATURE_EN &&
return ALIGN(max_t(int, inl_size, size), MLX5_SEND_WQE_BB); ALIGN(max_t(int, inl_size, size), MLX5_SEND_WQE_BB) < MLX5_SIG_WQE_SIZE)
return MLX5_SIG_WQE_SIZE;
else
return ALIGN(max_t(int, inl_size, size), MLX5_SEND_WQE_BB);
} }
static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr, static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr,
...@@ -284,6 +287,9 @@ static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr, ...@@ -284,6 +287,9 @@ static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr,
sizeof(struct mlx5_wqe_inline_seg); sizeof(struct mlx5_wqe_inline_seg);
attr->cap.max_inline_data = qp->max_inline_data; attr->cap.max_inline_data = qp->max_inline_data;
if (attr->create_flags & IB_QP_CREATE_SIGNATURE_EN)
qp->signature_en = true;
wq_size = roundup_pow_of_two(attr->cap.max_send_wr * wqe_size); wq_size = roundup_pow_of_two(attr->cap.max_send_wr * wqe_size);
qp->sq.wqe_cnt = wq_size / MLX5_SEND_WQE_BB; qp->sq.wqe_cnt = wq_size / MLX5_SEND_WQE_BB;
if (qp->sq.wqe_cnt > dev->mdev.caps.max_wqes) { if (qp->sq.wqe_cnt > dev->mdev.caps.max_wqes) {
...@@ -665,7 +671,7 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev, ...@@ -665,7 +671,7 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev,
int err; int err;
uuari = &dev->mdev.priv.uuari; uuari = &dev->mdev.priv.uuari;
if (init_attr->create_flags) if (init_attr->create_flags & ~IB_QP_CREATE_SIGNATURE_EN)
return -EINVAL; return -EINVAL;
if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR) if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR)
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/mlx5/driver.h> #include <linux/mlx5/driver.h>
#define MLX5_INVALID_LKEY 0x100 #define MLX5_INVALID_LKEY 0x100
#define MLX5_SIG_WQE_SIZE (MLX5_SEND_WQE_BB * 5)
enum mlx5_qp_optpar { enum mlx5_qp_optpar {
MLX5_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0, MLX5_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment