History

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.

Yishai Hadas committed 8 years ago

Commit 7f720521 parent 39945862 files · +49 −2Browse files

Unified · Split

2 files
  1. drivers/infiniband/hw/mlx5/qp.c +36 −2
  2. include/uapi/rdma/mlx5-abi.h +13 −0
drivers/infiniband/hw/mlx5/qp.c+36−2
@@ -1325,7 +1325,9 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev, · 1324 unmodified lines
13251325
13261326 static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
13271327 u32 *in, size_t inlen,
1328− struct ib_pd *pd)
1328+ struct ib_pd *pd,
1329+ struct ib_udata *udata,
1330+ struct mlx5_ib_create_qp_resp *resp)
13291331 {
13301332 struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp;
13311333 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, · 3 unmodified lines
13351337 struct mlx5_ib_ucontext *mucontext = to_mucontext(ucontext);
13361338 int err;
13371339 u32 tdn = mucontext->tdn;
1340+ u16 uid = to_mpd(pd)->uid;
13381341
13391342 if (qp->sq.wqe_cnt) {
13401343 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, · 4 unmodified lines
13451348 if (err)
13461349 goto err_destroy_tis;
13471350
1351+ if (uid) {
1352+ resp->tisn = sq->tisn;
1353+ resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TISN;
1354+ resp->sqn = sq->base.mqp.qpn;
1355+ resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_SQN;
1356+ }
1357+
13481358 sq->base.container_mibqp = qp;
13491359 sq->base.mqp.event = mlx5_ib_qp_event;
13501360 }
@@ -1363,13 +1373,25 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 12 unmodified lines
13631373 err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en, pd);
13641374 if (err)
13651375 goto err_destroy_rq;
1376+
1377+ if (uid) {
1378+ resp->rqn = rq->base.mqp.qpn;
1379+ resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_RQN;
1380+ resp->tirn = rq->tirn;
1381+ resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TIRN;
1382+ }
13661383 }
13671384
13681385 qp->trans_qp.base.mqp.qpn = qp->sq.wqe_cnt ? sq->base.mqp.qpn :
13691386 rq->base.mqp.qpn;
1387+ err = ib_copy_to_udata(udata, resp, min(udata->outlen, sizeof(*resp)));
1388+ if (err)
1389+ goto err_destroy_tir;
13701390
13711391 return 0;
13721392
1393+err_destroy_tir:
1394+ destroy_raw_packet_qp_tir(dev, rq, qp->flags_en, pd);
13731395 err_destroy_rq:
13741396 destroy_raw_packet_qp_rq(dev, rq);
13751397 err_destroy_sq:
@@ -1640,12 +1662,23 @@ create_tir: · 264 unmodified lines
16401662 if (err)
16411663 goto err;
16421664
1665+ if (mucontext->devx_uid) {
1666+ resp.comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TIRN;
1667+ resp.tirn = qp->rss_qp.tirn;
1668+ }
1669+
1670+ err = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp)));
1671+ if (err)
1672+ goto err_copy;
1673+
16431674 kvfree(in);
16441675 /* qpn is reserved for that QP */
16451676 qp->trans_qp.base.mqp.qpn = 0;
16461677 qp->flags |= MLX5_IB_QP_RSS;
16471678 return 0;
16481679
1680+err_copy:
1681+ mlx5_cmd_destroy_tir(dev->mdev, qp->rss_qp.tirn, mucontext->devx_uid);
16491682 err:
16501683 kvfree(in);
16511684 return err;
@@ -1978,7 +2011,8 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, · 326 unmodified lines
19782011 qp->flags & MLX5_IB_QP_UNDERLAY) {
19792012 qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd.sq_buf_addr;
19802013 raw_packet_qp_copy_info(qp, &qp->raw_packet_qp);
1981− err = create_raw_packet_qp(dev, qp, in, inlen, pd);
2014+ err = create_raw_packet_qp(dev, qp, in, inlen, pd, udata,
2015+ &resp);
19822016 } else {
19832017 err = mlx5_core_create_qp(dev->mdev, &base->mqp, in, inlen);
19842018 }
include/uapi/rdma/mlx5-abi.h+13−0
@@ -351,9 +351,22 @@ struct mlx5_ib_create_qp_rss { · 350 unmodified lines
351351 __u32 flags;
352352 };
353353
354+enum mlx5_ib_create_qp_resp_mask {
355+ MLX5_IB_CREATE_QP_RESP_MASK_TIRN = 1UL << 0,
356+ MLX5_IB_CREATE_QP_RESP_MASK_TISN = 1UL << 1,
357+ MLX5_IB_CREATE_QP_RESP_MASK_RQN = 1UL << 2,
358+ MLX5_IB_CREATE_QP_RESP_MASK_SQN = 1UL << 3,
359+};
360+
354361 struct mlx5_ib_create_qp_resp {
355362 __u32 bfreg_index;
356363 __u32 reserved;
364+ __u32 comp_mask;
365+ __u32 tirn;
366+ __u32 tisn;
367+ __u32 rqn;
368+ __u32 sqn;
369+ __u32 reserved1;
357370 };
358371
359372 struct mlx5_ib_alloc_mw {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t