IB/mlx5: Expose RAW QP device handles to user space
Expose RAW QP device handles to user space by extending the UHW part of mlx5_ib_create_qp_resp. This data is returned only when DEVX context is used where it may be applicable. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:

committed by
Jason Gunthorpe

parent
3994586f4d
commit
7f72052cb4
@@ -1325,7 +1325,9 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
||||
|
||||
static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
u32 *in, size_t inlen,
|
||||
struct ib_pd *pd)
|
||||
struct ib_pd *pd,
|
||||
struct ib_udata *udata,
|
||||
struct mlx5_ib_create_qp_resp *resp)
|
||||
{
|
||||
struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp;
|
||||
struct mlx5_ib_sq *sq = &raw_packet_qp->sq;
|
||||
@@ -1335,6 +1337,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
struct mlx5_ib_ucontext *mucontext = to_mucontext(ucontext);
|
||||
int err;
|
||||
u32 tdn = mucontext->tdn;
|
||||
u16 uid = to_mpd(pd)->uid;
|
||||
|
||||
if (qp->sq.wqe_cnt) {
|
||||
err = create_raw_packet_qp_tis(dev, qp, sq, tdn, pd);
|
||||
@@ -1345,6 +1348,13 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
if (err)
|
||||
goto err_destroy_tis;
|
||||
|
||||
if (uid) {
|
||||
resp->tisn = sq->tisn;
|
||||
resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TISN;
|
||||
resp->sqn = sq->base.mqp.qpn;
|
||||
resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_SQN;
|
||||
}
|
||||
|
||||
sq->base.container_mibqp = qp;
|
||||
sq->base.mqp.event = mlx5_ib_qp_event;
|
||||
}
|
||||
@@ -1363,13 +1373,25 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en, pd);
|
||||
if (err)
|
||||
goto err_destroy_rq;
|
||||
|
||||
if (uid) {
|
||||
resp->rqn = rq->base.mqp.qpn;
|
||||
resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_RQN;
|
||||
resp->tirn = rq->tirn;
|
||||
resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TIRN;
|
||||
}
|
||||
}
|
||||
|
||||
qp->trans_qp.base.mqp.qpn = qp->sq.wqe_cnt ? sq->base.mqp.qpn :
|
||||
rq->base.mqp.qpn;
|
||||
err = ib_copy_to_udata(udata, resp, min(udata->outlen, sizeof(*resp)));
|
||||
if (err)
|
||||
goto err_destroy_tir;
|
||||
|
||||
return 0;
|
||||
|
||||
err_destroy_tir:
|
||||
destroy_raw_packet_qp_tir(dev, rq, qp->flags_en, pd);
|
||||
err_destroy_rq:
|
||||
destroy_raw_packet_qp_rq(dev, rq);
|
||||
err_destroy_sq:
|
||||
@@ -1640,12 +1662,23 @@ create_tir:
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
if (mucontext->devx_uid) {
|
||||
resp.comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TIRN;
|
||||
resp.tirn = qp->rss_qp.tirn;
|
||||
}
|
||||
|
||||
err = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp)));
|
||||
if (err)
|
||||
goto err_copy;
|
||||
|
||||
kvfree(in);
|
||||
/* qpn is reserved for that QP */
|
||||
qp->trans_qp.base.mqp.qpn = 0;
|
||||
qp->flags |= MLX5_IB_QP_RSS;
|
||||
return 0;
|
||||
|
||||
err_copy:
|
||||
mlx5_cmd_destroy_tir(dev->mdev, qp->rss_qp.tirn, mucontext->devx_uid);
|
||||
err:
|
||||
kvfree(in);
|
||||
return err;
|
||||
@@ -1978,7 +2011,8 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
qp->flags & MLX5_IB_QP_UNDERLAY) {
|
||||
qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd.sq_buf_addr;
|
||||
raw_packet_qp_copy_info(qp, &qp->raw_packet_qp);
|
||||
err = create_raw_packet_qp(dev, qp, in, inlen, pd);
|
||||
err = create_raw_packet_qp(dev, qp, in, inlen, pd, udata,
|
||||
&resp);
|
||||
} else {
|
||||
err = mlx5_core_create_qp(dev->mdev, &base->mqp, in, inlen);
|
||||
}
|
||||
|
Reference in New Issue
Block a user