]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
rdma: Add an option to display driver-specific QPs in the rdma tool
authorChiara Meiohas <cmeiohas@nvidia.com>
Tue, 30 Apr 2024 10:18:20 +0000 (13:18 +0300)
committerDavid Ahern <dsahern@kernel.org>
Fri, 3 May 2024 15:15:22 +0000 (15:15 +0000)
Utilize the -dd flag (driver-specific details) in the rdmatool
to view driver-specific QPs which are not exposed yet.

The following examples show mlx5 UMR QP which is visible now:

$ rdma resource show qp link ibp8s0f1
link ibp8s0f1/1 lqpn 360 type UD state RTS sq-psn 0 comm [mlx5_ib]
link ibp8s0f1/1 lqpn 0 type SMI state RTS sq-psn 0 comm [ib_core]
link ibp8s0f1/1 lqpn 1 type GSI state RTS sq-psn 0 comm [ib_core]

$ rdma resource show qp link ibp8s0f1 -dd
link ibp8s0f1/1 lqpn 360 type UD state RTS sq-psn 0 comm [mlx5_ib]
link ibp8s0f1/1 lqpn 465 type DRIVER subtype REG_UMR state RTS sq-psn 0 comm [mlx5_ib]
link ibp8s0f1/1 lqpn 0 type SMI state RTS sq-psn 0 comm [ib_core]
link ibp8s0f1/1 lqpn 1 type GSI state RTS sq-psn 0 comm [ib_core]

$ rdma resource show
0: ibp8s0f0: pd 3 cq 4 qp 3 cm_id 0 mr 0 ctx 0 srq 2
1: ibp8s0f1: pd 3 cq 4 qp 3 cm_id 0 mr 0 ctx 0 srq 2

$ rdma resource show -dd
0: ibp8s0f0: pd 3 cq 4 qp 4 cm_id 0 mr 0 ctx 0 srq 2
1: ibp8s0f1: pd 3 cq 4 qp 4 cm_id 0 mr 0 ctx 0 srq 2

Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
rdma/res-qp.c
rdma/res.c
rdma/utils.c

index 65ff54ab729f879fe5c46f91801674ee888b1f92..a47225dff945f9cb7ad8eea78920919034cd0676 100644 (file)
@@ -40,6 +40,15 @@ static void print_type(uint32_t val)
        print_string(PRINT_ANY, "type", "type %s ", qp_types_to_str(val));
 }
 
+/*
+ * print the subtype only if the QPT is IB_QPT_DRIVER
+ */
+static void print_subtype(uint8_t type, const char *sub_type)
+{
+       if (type == 0xFF && sub_type)
+               print_string(PRINT_ANY, "subtype", "subtype %s ", sub_type);
+}
+
 static void print_state(uint32_t val)
 {
        print_string(PRINT_ANY, "state", "state %s ", qp_states_to_str(val));
@@ -81,6 +90,7 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
 {
        uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn;
        uint8_t type, state, path_mig_state = 0;
+       const char* sub_type = NULL;
        uint32_t port = 0, pid = 0;
        uint32_t pdn = 0;
        char *comm = NULL;
@@ -134,6 +144,10 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
                    nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]))
                goto out;
 
+       if (nla_line[RDMA_NLDEV_ATTR_RES_SUBTYPE])
+               sub_type =
+                       mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUBTYPE]);
+
        type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
        if (rd_is_string_filtered_attr(rd, "type", qp_types_to_str(type),
                                       nla_line[RDMA_NLDEV_ATTR_RES_TYPE]))
@@ -164,6 +178,7 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
        print_rqpn(rqpn, nla_line);
 
        print_type(type);
+       print_subtype(type, sub_type);
        print_state(state);
 
        print_rqpsn(rq_psn, nla_line);
index 3e024134d4fe0800b7eb9fd4922368f57d6afffb..c311513a3f5c98c3171fe7b679ea5224ea6a222b 100644 (file)
@@ -99,6 +99,8 @@ int _res_send_idx_msg(struct rd *rd, uint32_t command, mnl_cb_t callback,
                                 RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx);
 
        mnl_attr_put_u32(rd->nlh, id, idx);
+       mnl_attr_put_u8(rd->nlh, RDMA_NLDEV_ATTR_DRIVER_DETAILS,
+                       rd->show_driver_details);
 
        if (command == RDMA_NLDEV_CMD_STAT_GET)
                mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES,
@@ -121,6 +123,9 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback)
                flags |= NLM_F_DUMP;
 
        rd_prepare_msg(rd, command, &seq, flags);
+
+       mnl_attr_put_u8(rd->nlh, RDMA_NLDEV_ATTR_DRIVER_DETAILS,
+                       rd->show_driver_details);
        mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
        if (rd->port_idx)
                mnl_attr_put_u32(rd->nlh,
index 27595a387faaf7425ba93dadadad84a7af621a06..0f41013aac303d23f529bcc9262ffc175841325e 100644 (file)
@@ -423,6 +423,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_RES_SQ_PSN]            = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]    = MNL_TYPE_U8,
        [RDMA_NLDEV_ATTR_RES_TYPE]              = MNL_TYPE_U8,
+       [RDMA_NLDEV_ATTR_RES_SUBTYPE]           = MNL_TYPE_NUL_STRING,
        [RDMA_NLDEV_ATTR_RES_STATE]             = MNL_TYPE_U8,
        [RDMA_NLDEV_ATTR_RES_PID]               = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_RES_KERN_NAME] = MNL_TYPE_NUL_STRING,