RDMA/mlx5: Embed GSI QP into general mlx5_ib QP
The GSI QPs have different create flow from the regular QPs, but it is not really needed. Update the code to use mlx5_ib_qp as a storage class for all outside of GSI calls. Link: https://lore.kernel.org/r/20200926102450.2966017-2-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
b942fc0319
commit
0d9aef8603
@ -39,26 +39,6 @@ struct mlx5_ib_gsi_wr {
|
|||||||
bool completed:1;
|
bool completed:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5_ib_gsi_qp {
|
|
||||||
struct ib_qp ibqp;
|
|
||||||
struct ib_qp *rx_qp;
|
|
||||||
u8 port_num;
|
|
||||||
struct ib_qp_cap cap;
|
|
||||||
enum ib_sig_type sq_sig_type;
|
|
||||||
/* Serialize qp state modifications */
|
|
||||||
struct mutex mutex;
|
|
||||||
struct ib_cq *cq;
|
|
||||||
struct mlx5_ib_gsi_wr *outstanding_wrs;
|
|
||||||
u32 outstanding_pi, outstanding_ci;
|
|
||||||
int num_qps;
|
|
||||||
/* Protects access to the tx_qps. Post send operations synchronize
|
|
||||||
* with tx_qp creation in setup_qp(). Also protects the
|
|
||||||
* outstanding_wrs array and indices.
|
|
||||||
*/
|
|
||||||
spinlock_t lock;
|
|
||||||
struct ib_qp **tx_qps;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct mlx5_ib_gsi_qp *gsi_qp(struct ib_qp *qp)
|
static struct mlx5_ib_gsi_qp *gsi_qp(struct ib_qp *qp)
|
||||||
{
|
{
|
||||||
return container_of(qp, struct mlx5_ib_gsi_qp, ibqp);
|
return container_of(qp, struct mlx5_ib_gsi_qp, ibqp);
|
||||||
@ -116,6 +96,7 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
|||||||
struct ib_qp_init_attr *init_attr)
|
struct ib_qp_init_attr *init_attr)
|
||||||
{
|
{
|
||||||
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
||||||
|
struct mlx5_ib_qp *mqp;
|
||||||
struct mlx5_ib_gsi_qp *gsi;
|
struct mlx5_ib_gsi_qp *gsi;
|
||||||
struct ib_qp_init_attr hw_init_attr = *init_attr;
|
struct ib_qp_init_attr hw_init_attr = *init_attr;
|
||||||
const u8 port_num = init_attr->port_num;
|
const u8 port_num = init_attr->port_num;
|
||||||
@ -130,10 +111,11 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
|||||||
num_qps = MLX5_MAX_PORTS;
|
num_qps = MLX5_MAX_PORTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
gsi = kzalloc(sizeof(*gsi), GFP_KERNEL);
|
mqp = kzalloc(sizeof(struct mlx5_ib_qp), GFP_KERNEL);
|
||||||
if (!gsi)
|
if (!mqp)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
gsi = &mqp->gsi;
|
||||||
gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL);
|
gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL);
|
||||||
if (!gsi->tx_qps) {
|
if (!gsi->tx_qps) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@ -216,20 +198,18 @@ err_free_wrs:
|
|||||||
err_free_tx:
|
err_free_tx:
|
||||||
kfree(gsi->tx_qps);
|
kfree(gsi->tx_qps);
|
||||||
err_free:
|
err_free:
|
||||||
kfree(gsi);
|
kfree(mqp);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp)
|
int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)
|
||||||
{
|
{
|
||||||
struct mlx5_ib_dev *dev = to_mdev(qp->device);
|
struct mlx5_ib_dev *dev = to_mdev(mqp->ibqp.device);
|
||||||
struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
|
struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
|
||||||
const int port_num = gsi->port_num;
|
const int port_num = gsi->port_num;
|
||||||
int qp_index;
|
int qp_index;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mlx5_ib_dbg(dev, "destroying GSI QP\n");
|
|
||||||
|
|
||||||
mutex_lock(&dev->devr.mutex);
|
mutex_lock(&dev->devr.mutex);
|
||||||
ret = mlx5_ib_destroy_qp(gsi->rx_qp, NULL);
|
ret = mlx5_ib_destroy_qp(gsi->rx_qp, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -253,7 +233,7 @@ int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp)
|
|||||||
|
|
||||||
kfree(gsi->outstanding_wrs);
|
kfree(gsi->outstanding_wrs);
|
||||||
kfree(gsi->tx_qps);
|
kfree(gsi->tx_qps);
|
||||||
kfree(gsi);
|
kfree(mqp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -384,6 +384,26 @@ struct mlx5_ib_dct {
|
|||||||
u32 *in;
|
u32 *in;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mlx5_ib_gsi_qp {
|
||||||
|
struct ib_qp ibqp;
|
||||||
|
struct ib_qp *rx_qp;
|
||||||
|
u8 port_num;
|
||||||
|
struct ib_qp_cap cap;
|
||||||
|
enum ib_sig_type sq_sig_type;
|
||||||
|
/* Serialize qp state modifications */
|
||||||
|
struct mutex mutex;
|
||||||
|
struct ib_cq *cq;
|
||||||
|
struct mlx5_ib_gsi_wr *outstanding_wrs;
|
||||||
|
u32 outstanding_pi, outstanding_ci;
|
||||||
|
int num_qps;
|
||||||
|
/* Protects access to the tx_qps. Post send operations synchronize
|
||||||
|
* with tx_qp creation in setup_qp(). Also protects the
|
||||||
|
* outstanding_wrs array and indices.
|
||||||
|
*/
|
||||||
|
spinlock_t lock;
|
||||||
|
struct ib_qp **tx_qps;
|
||||||
|
};
|
||||||
|
|
||||||
struct mlx5_ib_qp {
|
struct mlx5_ib_qp {
|
||||||
struct ib_qp ibqp;
|
struct ib_qp ibqp;
|
||||||
union {
|
union {
|
||||||
@ -391,6 +411,7 @@ struct mlx5_ib_qp {
|
|||||||
struct mlx5_ib_raw_packet_qp raw_packet_qp;
|
struct mlx5_ib_raw_packet_qp raw_packet_qp;
|
||||||
struct mlx5_ib_rss_qp rss_qp;
|
struct mlx5_ib_rss_qp rss_qp;
|
||||||
struct mlx5_ib_dct dct;
|
struct mlx5_ib_dct dct;
|
||||||
|
struct mlx5_ib_gsi_qp gsi;
|
||||||
};
|
};
|
||||||
struct mlx5_frag_buf buf;
|
struct mlx5_frag_buf buf;
|
||||||
|
|
||||||
@ -693,8 +714,6 @@ struct mlx5_mr_cache {
|
|||||||
unsigned long last_add;
|
unsigned long last_add;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5_ib_gsi_qp;
|
|
||||||
|
|
||||||
struct mlx5_ib_port_resources {
|
struct mlx5_ib_port_resources {
|
||||||
struct mlx5_ib_resources *devr;
|
struct mlx5_ib_resources *devr;
|
||||||
struct mlx5_ib_gsi_qp *gsi;
|
struct mlx5_ib_gsi_qp *gsi;
|
||||||
@ -1322,7 +1341,7 @@ void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
|
|||||||
/* GSI QP helper functions */
|
/* GSI QP helper functions */
|
||||||
struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
|
||||||
struct ib_qp_init_attr *init_attr);
|
struct ib_qp_init_attr *init_attr);
|
||||||
int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp);
|
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 mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
|
||||||
int attr_mask);
|
int attr_mask);
|
||||||
int mlx5_ib_gsi_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
|
int mlx5_ib_gsi_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
|
||||||
|
@ -3037,7 +3037,7 @@ int mlx5_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
|
|||||||
struct mlx5_ib_qp *mqp = to_mqp(qp);
|
struct mlx5_ib_qp *mqp = to_mqp(qp);
|
||||||
|
|
||||||
if (unlikely(qp->qp_type == IB_QPT_GSI))
|
if (unlikely(qp->qp_type == IB_QPT_GSI))
|
||||||
return mlx5_ib_gsi_destroy_qp(qp);
|
return mlx5_ib_destroy_gsi(mqp);
|
||||||
|
|
||||||
if (mqp->type == MLX5_IB_QPT_DCT)
|
if (mqp->type == MLX5_IB_QPT_DCT)
|
||||||
return mlx5_ib_destroy_dct(mqp);
|
return mlx5_ib_destroy_dct(mqp);
|
||||||
|
Loading…
Reference in New Issue
Block a user