1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
4 * Authors: Leon Romanovsky <leonro@mellanox.com>
10 static const char *path_mig_to_str(uint8_t idx
)
12 static const char *const path_mig_str
[] = { "MIGRATED", "REARM",
15 if (idx
< ARRAY_SIZE(path_mig_str
))
16 return path_mig_str
[idx
];
20 static const char *qp_states_to_str(uint8_t idx
)
22 static const char *const qp_states_str
[] = { "RESET", "INIT", "RTR",
26 if (idx
< ARRAY_SIZE(qp_states_str
))
27 return qp_states_str
[idx
];
31 static void print_rqpn(struct rd
*rd
, uint32_t val
, struct nlattr
**nla_line
)
33 if (!nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
])
35 print_color_uint(PRINT_ANY
, COLOR_NONE
, "rqpn", "rqpn %d ", val
);
38 static void print_type(struct rd
*rd
, uint32_t val
)
40 print_color_string(PRINT_ANY
, COLOR_NONE
, "type", "type %s ",
41 qp_types_to_str(val
));
44 static void print_state(struct rd
*rd
, uint32_t val
)
46 print_color_string(PRINT_ANY
, COLOR_NONE
, "state", "state %s ",
47 qp_states_to_str(val
));
50 static void print_rqpsn(struct rd
*rd
, uint32_t val
, struct nlattr
**nla_line
)
52 if (!nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
])
55 print_color_uint(PRINT_ANY
, COLOR_NONE
, "rq-psn", "rq-psn %d ", val
);
58 static void print_pathmig(struct rd
*rd
, uint32_t val
, struct nlattr
**nla_line
)
60 if (!nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
])
63 print_color_string(PRINT_ANY
, COLOR_NONE
, "path-mig-state",
64 "path-mig-state %s ", path_mig_to_str(val
));
67 static int res_qp_line(struct rd
*rd
, const char *name
, int idx
,
68 struct nlattr
**nla_line
)
70 uint32_t lqpn
, rqpn
= 0, rq_psn
= 0, sq_psn
;
71 uint8_t type
, state
, path_mig_state
= 0;
72 uint32_t port
= 0, pid
= 0;
76 if (!nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
] ||
77 !nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
] ||
78 !nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
] ||
79 !nla_line
[RDMA_NLDEV_ATTR_RES_STATE
])
82 if (nla_line
[RDMA_NLDEV_ATTR_PORT_INDEX
])
83 port
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_PORT_INDEX
]);
85 if (port
!= rd
->port_idx
)
88 lqpn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]);
89 if (rd_is_filtered_attr(rd
, "lqpn", lqpn
,
90 nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]))
93 if (nla_line
[RDMA_NLDEV_ATTR_RES_PDN
])
94 pdn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]);
95 if (rd_is_filtered_attr(rd
, "pdn", pdn
,
96 nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]))
99 if (nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
])
100 rqpn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
]);
101 if (rd_is_filtered_attr(rd
, "rqpn", rqpn
,
102 nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
]))
105 if (nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
])
106 rq_psn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
]);
107 if (rd_is_filtered_attr(rd
, "rq-psn", rq_psn
,
108 nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
]))
111 sq_psn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]);
112 if (rd_is_filtered_attr(rd
, "sq-psn", sq_psn
,
113 nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]))
116 if (nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
])
117 path_mig_state
= mnl_attr_get_u8(
118 nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
]);
119 if (rd_is_string_filtered_attr(
120 rd
, "path-mig-state", path_mig_to_str(path_mig_state
),
121 nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
]))
124 type
= mnl_attr_get_u8(nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
]);
125 if (rd_is_string_filtered_attr(rd
, "type", qp_types_to_str(type
),
126 nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
]))
129 state
= mnl_attr_get_u8(nla_line
[RDMA_NLDEV_ATTR_RES_STATE
]);
130 if (rd_is_string_filtered_attr(rd
, "state", qp_states_to_str(state
),
131 nla_line
[RDMA_NLDEV_ATTR_RES_STATE
]))
134 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
]) {
135 pid
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_PID
]);
136 comm
= get_task_name(pid
);
139 if (rd_is_filtered_attr(rd
, "pid", pid
,
140 nla_line
[RDMA_NLDEV_ATTR_RES_PID
]))
143 if (nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
])
144 /* discard const from mnl_attr_get_str */
145 comm
= (char *)mnl_attr_get_str(
146 nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
]);
148 open_json_object(NULL
);
149 print_link(rd
, idx
, name
, port
, nla_line
);
150 res_print_uint(rd
, "lqpn", lqpn
, nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]);
151 print_rqpn(rd
, rqpn
, nla_line
);
153 print_type(rd
, type
);
154 print_state(rd
, state
);
156 print_rqpsn(rd
, rq_psn
, nla_line
);
157 res_print_uint(rd
, "sq-psn", sq_psn
,
158 nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]);
160 print_pathmig(rd
, path_mig_state
, nla_line
);
161 res_print_uint(rd
, "pdn", pdn
, nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]);
162 res_print_uint(rd
, "pid", pid
, nla_line
[RDMA_NLDEV_ATTR_RES_PID
]);
163 print_comm(rd
, comm
, nla_line
);
165 print_driver_table(rd
, nla_line
[RDMA_NLDEV_ATTR_DRIVER
]);
168 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
])
173 int res_qp_idx_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
175 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
176 struct rd
*rd
= data
;
180 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
181 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
])
184 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
185 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
187 return res_qp_line(rd
, name
, idx
, tb
);
190 int res_qp_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
192 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
193 struct nlattr
*nla_table
, *nla_entry
;
194 struct rd
*rd
= data
;
199 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
200 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
] ||
201 !tb
[RDMA_NLDEV_ATTR_RES_QP
])
204 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
205 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
206 nla_table
= tb
[RDMA_NLDEV_ATTR_RES_QP
];
208 mnl_attr_for_each_nested(nla_entry
, nla_table
) {
209 struct nlattr
*nla_line
[RDMA_NLDEV_ATTR_MAX
] = {};
211 ret
= mnl_attr_parse_nested(nla_entry
, rd_attr_cb
, nla_line
);
212 if (ret
!= MNL_CB_OK
)
215 ret
= res_qp_line(rd
, name
, idx
, nla_line
);
216 if (ret
!= MNL_CB_OK
)