OSDN Git Service

IB/mlx5: Expose RAW QP device handles to user space
authorYishai Hadas <yishaih@mellanox.com>
Thu, 20 Sep 2018 18:45:18 +0000 (21:45 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 27 Sep 2018 19:01:33 +0000 (13:01 -0600)
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>
drivers/infiniband/hw/mlx5/qp.c
include/uapi/rdma/mlx5-abi.h

index 3455b50..c49a081 100644 (file)
@@ -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);
        }
index e584ba4..6056625 100644 (file)
@@ -351,9 +351,22 @@ struct mlx5_ib_create_qp_rss {
        __u32   flags;
 };
 
+enum mlx5_ib_create_qp_resp_mask {
+       MLX5_IB_CREATE_QP_RESP_MASK_TIRN = 1UL << 0,
+       MLX5_IB_CREATE_QP_RESP_MASK_TISN = 1UL << 1,
+       MLX5_IB_CREATE_QP_RESP_MASK_RQN  = 1UL << 2,
+       MLX5_IB_CREATE_QP_RESP_MASK_SQN  = 1UL << 3,
+};
+
 struct mlx5_ib_create_qp_resp {
        __u32   bfreg_index;
        __u32   reserved;
+       __u32   comp_mask;
+       __u32   tirn;
+       __u32   tisn;
+       __u32   rqn;
+       __u32   sqn;
+       __u32   reserved1;
 };
 
 struct mlx5_ib_alloc_mw {