mirror of https://gitee.com/openkylin/linux.git
RDMA/mlx5: Change GSI QP to have same creation flow like other QPs
There is no reason to have separate create flow for the GSI QP, while general create_qp routine has all needed checks and ability to allocate and free the proper struct mlx5_ib_qp. Link: https://lore.kernel.org/r/20200926102450.2966017-4-leon@kernel.org Reviewed-by: Maor Gottlieb <maorg@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
f8225e3488
commit
2dc4d6725b
|
@ -89,14 +89,13 @@ static void handle_single_completion(struct ib_cq *cq, struct ib_wc *wc)
|
|||
spin_unlock_irqrestore(&gsi->lock, flags);
|
||||
}
|
||||
|
||||
struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
||||
struct ib_qp_init_attr *init_attr)
|
||||
int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,
|
||||
struct ib_qp_init_attr *attr)
|
||||
{
|
||||
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
||||
struct mlx5_ib_qp *mqp;
|
||||
struct mlx5_ib_gsi_qp *gsi;
|
||||
struct ib_qp_init_attr hw_init_attr = *init_attr;
|
||||
const u8 port_num = init_attr->port_num;
|
||||
struct ib_qp_init_attr hw_init_attr = *attr;
|
||||
const u8 port_num = attr->port_num;
|
||||
int num_qps = 0;
|
||||
int ret;
|
||||
|
||||
|
@ -108,27 +107,19 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
|||
num_qps = MLX5_MAX_PORTS;
|
||||
}
|
||||
|
||||
mqp = kzalloc(sizeof(struct mlx5_ib_qp), GFP_KERNEL);
|
||||
if (!mqp)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
gsi = &mqp->gsi;
|
||||
gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL);
|
||||
if (!gsi->tx_qps) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free;
|
||||
}
|
||||
if (!gsi->tx_qps)
|
||||
return -ENOMEM;
|
||||
|
||||
gsi->outstanding_wrs = kcalloc(init_attr->cap.max_send_wr,
|
||||
sizeof(*gsi->outstanding_wrs),
|
||||
GFP_KERNEL);
|
||||
gsi->outstanding_wrs =
|
||||
kcalloc(attr->cap.max_send_wr, sizeof(*gsi->outstanding_wrs),
|
||||
GFP_KERNEL);
|
||||
if (!gsi->outstanding_wrs) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_tx;
|
||||
}
|
||||
|
||||
mutex_init(&mqp->mutex);
|
||||
|
||||
mutex_lock(&dev->devr.mutex);
|
||||
|
||||
if (dev->devr.ports[port_num - 1].gsi) {
|
||||
|
@ -140,12 +131,11 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
|||
gsi->num_qps = num_qps;
|
||||
spin_lock_init(&gsi->lock);
|
||||
|
||||
gsi->cap = init_attr->cap;
|
||||
gsi->sq_sig_type = init_attr->sq_sig_type;
|
||||
mqp->ibqp.qp_num = 1;
|
||||
gsi->cap = attr->cap;
|
||||
gsi->sq_sig_type = attr->sq_sig_type;
|
||||
gsi->port_num = port_num;
|
||||
|
||||
gsi->cq = ib_alloc_cq(pd->device, gsi, init_attr->cap.max_send_wr, 0,
|
||||
gsi->cq = ib_alloc_cq(pd->device, gsi, attr->cap.max_send_wr, 0,
|
||||
IB_POLL_SOFTIRQ);
|
||||
if (IS_ERR(gsi->cq)) {
|
||||
mlx5_ib_warn(dev, "unable to create send CQ for GSI QP. error %ld\n",
|
||||
|
@ -181,11 +171,11 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
|||
INIT_LIST_HEAD(&gsi->rx_qp->rdma_mrs);
|
||||
INIT_LIST_HEAD(&gsi->rx_qp->sig_mrs);
|
||||
|
||||
dev->devr.ports[init_attr->port_num - 1].gsi = gsi;
|
||||
dev->devr.ports[attr->port_num - 1].gsi = gsi;
|
||||
|
||||
mutex_unlock(&dev->devr.mutex);
|
||||
|
||||
return &mqp->ibqp;
|
||||
return 0;
|
||||
|
||||
err_destroy_cq:
|
||||
ib_free_cq(gsi->cq);
|
||||
|
@ -194,9 +184,7 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
|||
kfree(gsi->outstanding_wrs);
|
||||
err_free_tx:
|
||||
kfree(gsi->tx_qps);
|
||||
err_free:
|
||||
kfree(mqp);
|
||||
return ERR_PTR(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)
|
||||
|
|
|
@ -1335,8 +1335,8 @@ void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
|
|||
void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
|
||||
|
||||
/* GSI QP helper functions */
|
||||
struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
||||
struct ib_qp_init_attr *init_attr);
|
||||
int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,
|
||||
struct ib_qp_init_attr *attr);
|
||||
int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp);
|
||||
int mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
|
||||
int attr_mask);
|
||||
|
@ -1375,7 +1375,7 @@ static inline void init_query_mad(struct ib_smp *mad)
|
|||
|
||||
static inline int is_qp1(enum ib_qp_type qp_type)
|
||||
{
|
||||
return qp_type == MLX5_IB_QPT_HW_GSI;
|
||||
return qp_type == MLX5_IB_QPT_HW_GSI || qp_type == IB_QPT_GSI;
|
||||
}
|
||||
|
||||
#define MLX5_MAX_UMR_SHIFT 16
|
||||
|
|
|
@ -2785,21 +2785,23 @@ static int create_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (qp->type == MLX5_IB_QPT_DCT) {
|
||||
switch (qp->type) {
|
||||
case MLX5_IB_QPT_DCT:
|
||||
err = create_dct(dev, pd, qp, params);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (qp->type == IB_QPT_XRC_TGT) {
|
||||
break;
|
||||
case IB_QPT_XRC_TGT:
|
||||
err = create_xrc_tgt_qp(dev, qp, params);
|
||||
goto out;
|
||||
break;
|
||||
case IB_QPT_GSI:
|
||||
err = mlx5_ib_create_gsi(pd, qp, params->attr);
|
||||
break;
|
||||
default:
|
||||
if (params->udata)
|
||||
err = create_user_qp(dev, pd, qp, params);
|
||||
else
|
||||
err = create_kernel_qp(dev, pd, qp, params);
|
||||
}
|
||||
|
||||
if (params->udata)
|
||||
err = create_user_qp(dev, pd, qp, params);
|
||||
else
|
||||
err = create_kernel_qp(dev, pd, qp, params);
|
||||
|
||||
out:
|
||||
if (err) {
|
||||
mlx5_ib_err(dev, "Create QP type %d failed\n", qp->type);
|
||||
|
@ -2939,9 +2941,6 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attr,
|
|||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
if (attr->qp_type == IB_QPT_GSI)
|
||||
return mlx5_ib_gsi_create_qp(pd, attr);
|
||||
|
||||
params.udata = udata;
|
||||
params.uidx = MLX5_IB_DEFAULT_UIDX;
|
||||
params.attr = attr;
|
||||
|
@ -3010,9 +3009,14 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attr,
|
|||
return &qp->ibqp;
|
||||
|
||||
destroy_qp:
|
||||
if (qp->type == MLX5_IB_QPT_DCT) {
|
||||
switch (qp->type) {
|
||||
case MLX5_IB_QPT_DCT:
|
||||
mlx5_ib_destroy_dct(qp);
|
||||
} else {
|
||||
break;
|
||||
case IB_QPT_GSI:
|
||||
mlx5_ib_destroy_gsi(qp);
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* These lines below are temp solution till QP allocation
|
||||
* will be moved to be under IB/core responsiblity.
|
||||
|
|
Loading…
Reference in New Issue