RDMA/mlx5: Track DCT, DCI and REG_UMR QPs as diver_detail resources.
authorChiara Meiohas <cmeiohas@nvidia.com>
Tue, 16 Apr 2024 12:03:51 +0000 (15:03 +0300)
committerLeon Romanovsky <leon@kernel.org>
Tue, 30 Apr 2024 08:19:37 +0000 (11:19 +0300)
Allow user to see driver-specific QPs (the "driver_detail" QPs)
through the rdmatool, when requested.

When creating DCT, DCI and REG_UMR QPs, we designate them as driver_detail
resources.

When filling the QP info for the rdma tool, for the driver_detail QPs:
-the QP type is IB_QPT_DRIVER
-the subtype is a string with the QP name ("DCT", "DCI", "REG_UMR")

Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com>
Link: https://lore.kernel.org/r/452432d7d0917f053a80a893a614169857fe3b10.1713268997.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/mlx5/qp.c
drivers/infiniband/hw/mlx5/restrack.c

index 8115ab107149f6981ea7f3c82bc07d9dc72c75c2..e2164f813607a5ed09dec0179d783c1f9a11f79a 100644 (file)
@@ -3097,7 +3097,6 @@ static int create_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
        switch (qp->type) {
        case MLX5_IB_QPT_DCT:
                err = create_dct(dev, pd, qp, params);
-               rdma_restrack_no_track(&qp->ibqp.res);
                break;
        case MLX5_IB_QPT_DCI:
                err = create_dci(dev, pd, qp, params);
@@ -3109,9 +3108,9 @@ static int create_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
                err = mlx5_ib_create_gsi(pd, qp, params->attr);
                break;
        case MLX5_IB_QPT_HW_GSI:
-       case MLX5_IB_QPT_REG_UMR:
                rdma_restrack_no_track(&qp->ibqp.res);
                fallthrough;
+       case MLX5_IB_QPT_REG_UMR:
        default:
                if (params->udata)
                        err = create_user_qp(dev, pd, qp, params);
index 4ac429e72004c3aa830e4debee52527ed5669a02..affcf8fe943c1d3ada09ea4fae0b559d16b20fe2 100644 (file)
@@ -156,6 +156,34 @@ static int fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ibcq)
        return fill_res_raw(msg, dev, MLX5_SGMT_TYPE_PRM_QUERY_CQ, cq->mcq.cqn);
 }
 
+static int fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ibqp)
+{
+       struct mlx5_ib_qp *qp = to_mqp(ibqp);
+       int ret;
+
+       if (qp->type < IB_QPT_DRIVER)
+               return 0;
+
+       switch (qp->type) {
+       case MLX5_IB_QPT_REG_UMR:
+               ret = nla_put_string(msg, RDMA_NLDEV_ATTR_RES_SUBTYPE,
+                                    "REG_UMR");
+               break;
+       case MLX5_IB_QPT_DCT:
+               ret = nla_put_string(msg, RDMA_NLDEV_ATTR_RES_SUBTYPE, "DCT");
+               break;
+       case MLX5_IB_QPT_DCI:
+               ret = nla_put_string(msg, RDMA_NLDEV_ATTR_RES_SUBTYPE, "DCI");
+               break;
+       default:
+               return 0;
+       }
+       if (ret)
+               return ret;
+
+       return nla_put_u8(msg, RDMA_NLDEV_ATTR_RES_TYPE, IB_QPT_DRIVER);
+}
+
 static int fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ibqp)
 {
        struct mlx5_ib_dev *dev = to_mdev(ibqp->device);
@@ -168,6 +196,7 @@ static const struct ib_device_ops restrack_ops = {
        .fill_res_cq_entry_raw = fill_res_cq_entry_raw,
        .fill_res_mr_entry = fill_res_mr_entry,
        .fill_res_mr_entry_raw = fill_res_mr_entry_raw,
+       .fill_res_qp_entry = fill_res_qp_entry,
        .fill_res_qp_entry_raw = fill_res_qp_entry_raw,
        .fill_stat_mr_entry = fill_stat_mr_entry,
 };