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 | 1326 | static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, |
| 1327 | 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 | 1332 | struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp; |
| 1331 | 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 | 1337 | struct mlx5_ib_ucontext *mucontext = to_mucontext(ucontext); |
| 1336 | 1338 | int err; |
| 1337 | 1339 | u32 tdn = mucontext->tdn; |
| 1340 | + u16 uid = to_mpd(pd)->uid; | |
| 1338 | 1341 | |
| 1339 | 1342 | if (qp->sq.wqe_cnt) { |
| 1340 | 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 | 1348 | if (err) |
| 1346 | 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 | 1358 | sq->base.container_mibqp = qp; |
| 1349 | 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 | 1373 | err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en, pd); |
| 1364 | 1374 | if (err) |
| 1365 | 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 | 1385 | qp->trans_qp.base.mqp.qpn = qp->sq.wqe_cnt ? sq->base.mqp.qpn : |
| 1369 | 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 | 1391 | return 0; |
| 1372 | 1392 | |
| 1393 | +err_destroy_tir: | |
| 1394 | + destroy_raw_packet_qp_tir(dev, rq, qp->flags_en, pd); | |
| 1373 | 1395 | err_destroy_rq: |
| 1374 | 1396 | destroy_raw_packet_qp_rq(dev, rq); |
| 1375 | 1397 | err_destroy_sq: |
| @@ -1640,12 +1662,23 @@ create_tir: · 264 unmodified lines | ||
| 1640 | 1662 | if (err) |
| 1641 | 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 | 1674 | kvfree(in); |
| 1644 | 1675 | /* qpn is reserved for that QP */ |
| 1645 | 1676 | qp->trans_qp.base.mqp.qpn = 0; |
| 1646 | 1677 | qp->flags |= MLX5_IB_QP_RSS; |
| 1647 | 1678 | return 0; |
| 1648 | 1679 | |
| 1680 | +err_copy: | |
| 1681 | + mlx5_cmd_destroy_tir(dev->mdev, qp->rss_qp.tirn, mucontext->devx_uid); | |
| 1649 | 1682 | err: |
| 1650 | 1683 | kvfree(in); |
| 1651 | 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 | 2011 | qp->flags & MLX5_IB_QP_UNDERLAY) { |
| 1979 | 2012 | qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd.sq_buf_addr; |
| 1980 | 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 | 2016 | } else { |
| 1983 | 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 | 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 | 361 | struct mlx5_ib_create_qp_resp { |
| 355 | 362 | __u32 bfreg_index; |
| 356 | 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 | 372 | struct mlx5_ib_alloc_mw { |