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.
Unified · Split
| @@ -1325,7 +1325,9 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev, · 1324 unmodified lines | |||
| 1325 | 1325 | ||
| 1326 | static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, | 1326 | static 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 | ||
| 1393 | err_destroy_tir: | ||
| 1394 | destroy_raw_packet_qp_tir(dev, rq, qp->flags_en, pd); | ||
| 1373 | err_destroy_rq: | 1395 | err_destroy_rq: |
| 1374 | destroy_raw_packet_qp_rq(dev, rq); | 1396 | destroy_raw_packet_qp_rq(dev, rq); |
| 1375 | err_destroy_sq: | 1397 | err_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 | ||
| 1680 | err_copy: | ||
| 1681 | mlx5_cmd_destroy_tir(dev->mdev, qp->rss_qp.tirn, mucontext->devx_uid); | ||
| 1649 | err: | 1682 | err: |
| 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 | } |
| @@ -351,9 +351,22 @@ struct mlx5_ib_create_qp_rss { · 350 unmodified lines | |||
| 351 | __u32 flags; | 351 | __u32 flags; |
| 352 | }; | 352 | }; |
| 353 | 353 | ||
| 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 | |||
| 354 | struct mlx5_ib_create_qp_resp { | 361 | struct 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 | ||
| 359 | struct mlx5_ib_alloc_mw { | 372 | struct mlx5_ib_alloc_mw { |