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
1325 1325
1326static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,1326static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
1327 u32 *in, size_t inlen,1327 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)
1329{1331{
1330 struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp;1332 struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp;
1331 struct mlx5_ib_sq *sq = &raw_packet_qp->sq;1333 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
1335 struct mlx5_ib_ucontext *mucontext = to_mucontext(ucontext);1337 struct mlx5_ib_ucontext *mucontext = to_mucontext(ucontext);
1336 int err;1338 int err;
1337 u32 tdn = mucontext->tdn;1339 u32 tdn = mucontext->tdn;
1340 u16 uid = to_mpd(pd)->uid;
1338 1341
1339 if (qp->sq.wqe_cnt) {1342 if (qp->sq.wqe_cnt) {
1340 err = create_raw_packet_qp_tis(dev, qp, sq, tdn, pd);1343 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
1345 if (err)1348 if (err)
1346 goto err_destroy_tis;1349 goto err_destroy_tis;
1347 1350
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
1348 sq->base.container_mibqp = qp;1358 sq->base.container_mibqp = qp;
1349 sq->base.mqp.event = mlx5_ib_qp_event;1359 sq->base.mqp.event = mlx5_ib_qp_event;
1350 }1360 }
@@ -1363,13 +1373,25 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 12 unmodified lines
1363 err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en, pd);1373 err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en, pd);
1364 if (err)1374 if (err)
1365 goto err_destroy_rq;1375 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 }
1366 }1383 }
1367 1384
1368 qp->trans_qp.base.mqp.qpn = qp->sq.wqe_cnt ? sq->base.mqp.qpn :1385 qp->trans_qp.base.mqp.qpn = qp->sq.wqe_cnt ? sq->base.mqp.qpn :
1369 rq->base.mqp.qpn;1386 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;
1370 1390
1371 return 0;1391 return 0;
1372 1392
1393err_destroy_tir:
1394 destroy_raw_packet_qp_tir(dev, rq, qp->flags_en, pd);
1373err_destroy_rq:1395err_destroy_rq:
1374 destroy_raw_packet_qp_rq(dev, rq);1396 destroy_raw_packet_qp_rq(dev, rq);
1375err_destroy_sq:1397err_destroy_sq:
@@ -1640,12 +1662,23 @@ create_tir: · 264 unmodified lines
1640 if (err)1662 if (err)
1641 goto err;1663 goto err;
1642 1664
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
1643 kvfree(in);1674 kvfree(in);
1644 /* qpn is reserved for that QP */1675 /* qpn is reserved for that QP */
1645 qp->trans_qp.base.mqp.qpn = 0;1676 qp->trans_qp.base.mqp.qpn = 0;
1646 qp->flags |= MLX5_IB_QP_RSS;1677 qp->flags |= MLX5_IB_QP_RSS;
1647 return 0;1678 return 0;
1648 1679
1680err_copy:
1681 mlx5_cmd_destroy_tir(dev->mdev, qp->rss_qp.tirn, mucontext->devx_uid);
1649err:1682err:
1650 kvfree(in);1683 kvfree(in);
1651 return err;1684 return err;
@@ -1978,7 +2011,8 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, · 326 unmodified lines
1978 qp->flags & MLX5_IB_QP_UNDERLAY) {2011 qp->flags & MLX5_IB_QP_UNDERLAY) {
1979 qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd.sq_buf_addr;2012 qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd.sq_buf_addr;
1980 raw_packet_qp_copy_info(qp, &qp->raw_packet_qp);2013 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);
1982 } else {2016 } else {
1983 err = mlx5_core_create_qp(dev->mdev, &base->mqp, in, inlen);2017 err = mlx5_core_create_qp(dev->mdev, &base->mqp, in, inlen);
1984 }2018 }
include/uapi/rdma/mlx5-abi.h+13−0
@@ -351,9 +351,22 @@ struct mlx5_ib_create_qp_rss { · 350 unmodified lines
351 __u32 flags;351 __u32 flags;
352};352};
353 353
354enum 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
354struct mlx5_ib_create_qp_resp {361struct mlx5_ib_create_qp_resp {
355 __u32 bfreg_index;362 __u32 bfreg_index;
356 __u32 reserved;363 __u32 reserved;
364 __u32 comp_mask;
365 __u32 tirn;
366 __u32 tisn;
367 __u32 rqn;
368 __u32 sqn;
369 __u32 reserved1;
357};370};
358 371
359struct mlx5_ib_alloc_mw {372struct 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