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
])
37 jsonw_uint_field(rd
->jw
, "rqpn", val
);
39 pr_out("rqpn %u ", val
);
42 static void print_type(struct rd
*rd
, uint32_t val
)
45 jsonw_string_field(rd
->jw
, "type", qp_types_to_str(val
));
47 pr_out("type %s ", qp_types_to_str(val
));
50 static void print_state(struct rd
*rd
, uint32_t val
)
53 jsonw_string_field(rd
->jw
, "state", qp_states_to_str(val
));
55 pr_out("state %s ", qp_states_to_str(val
));
58 static void print_rqpsn(struct rd
*rd
, uint32_t val
, struct nlattr
**nla_line
)
60 if (!nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
])
64 jsonw_uint_field(rd
->jw
, "rq-psn", val
);
66 pr_out("rq-psn %u ", val
);
69 static void print_pathmig(struct rd
*rd
, uint32_t val
, struct nlattr
**nla_line
)
71 if (!nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
])
75 jsonw_string_field(rd
->jw
, "path-mig-state",
76 path_mig_to_str(val
));
78 pr_out("path-mig-state %s ", path_mig_to_str(val
));
81 static int res_qp_line(struct rd
*rd
, const char *name
, int idx
,
82 struct nlattr
**nla_line
)
84 uint32_t lqpn
, rqpn
= 0, rq_psn
= 0, sq_psn
;
85 uint8_t type
, state
, path_mig_state
= 0;
86 uint32_t port
= 0, pid
= 0;
90 if (!nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
] ||
91 !nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
] ||
92 !nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
] ||
93 !nla_line
[RDMA_NLDEV_ATTR_RES_STATE
] ||
94 (!nla_line
[RDMA_NLDEV_ATTR_RES_PID
] &&
95 !nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
])) {
99 if (nla_line
[RDMA_NLDEV_ATTR_PORT_INDEX
])
100 port
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_PORT_INDEX
]);
102 if (port
!= rd
->port_idx
)
105 lqpn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]);
106 if (rd_check_is_filtered(rd
, "lqpn", lqpn
))
109 if (nla_line
[RDMA_NLDEV_ATTR_RES_PDN
])
110 pdn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]);
111 if (rd_check_is_filtered(rd
, "pdn", pdn
))
114 if (nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
]) {
115 rqpn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
]);
116 if (rd_check_is_filtered(rd
, "rqpn", rqpn
))
119 if (rd_check_is_key_exist(rd
, "rqpn"))
123 if (nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
]) {
124 rq_psn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
]);
125 if (rd_check_is_filtered(rd
, "rq-psn", rq_psn
))
128 if (rd_check_is_key_exist(rd
, "rq-psn"))
132 sq_psn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]);
133 if (rd_check_is_filtered(rd
, "sq-psn", sq_psn
))
136 if (nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
]) {
137 path_mig_state
= mnl_attr_get_u8(
138 nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
]);
139 if (rd_check_is_string_filtered(rd
, "path-mig-state",
140 path_mig_to_str(path_mig_state
)))
143 if (rd_check_is_key_exist(rd
, "path-mig-state"))
147 type
= mnl_attr_get_u8(nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
]);
148 if (rd_check_is_string_filtered(rd
, "type", qp_types_to_str(type
)))
151 state
= mnl_attr_get_u8(nla_line
[RDMA_NLDEV_ATTR_RES_STATE
]);
152 if (rd_check_is_string_filtered(rd
, "state", qp_states_to_str(state
)))
155 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
]) {
156 pid
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_PID
]);
157 comm
= get_task_name(pid
);
160 if (rd_check_is_filtered(rd
, "pid", pid
))
163 if (nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
])
164 /* discard const from mnl_attr_get_str */
165 comm
= (char *)mnl_attr_get_str(
166 nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
]);
169 jsonw_start_array(rd
->jw
);
171 print_link(rd
, idx
, name
, port
, nla_line
);
173 res_print_uint(rd
, "lqpn", lqpn
, nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]);
174 print_rqpn(rd
, rqpn
, nla_line
);
176 print_type(rd
, type
);
177 print_state(rd
, state
);
179 print_rqpsn(rd
, rq_psn
, nla_line
);
180 res_print_uint(rd
, "sq-psn", sq_psn
,
181 nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]);
183 print_pathmig(rd
, path_mig_state
, nla_line
);
184 res_print_uint(rd
, "pdn", pdn
, nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]);
185 res_print_uint(rd
, "pid", pid
, nla_line
[RDMA_NLDEV_ATTR_RES_PID
]);
186 print_comm(rd
, comm
, nla_line
);
188 print_driver_table(rd
, nla_line
[RDMA_NLDEV_ATTR_DRIVER
]);
191 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
])
196 int res_qp_idx_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
198 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
199 struct rd
*rd
= data
;
203 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
204 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
])
207 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
208 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
210 return res_qp_line(rd
, name
, idx
, tb
);
213 int res_qp_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
215 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
216 struct nlattr
*nla_table
, *nla_entry
;
217 struct rd
*rd
= data
;
222 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
223 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
] ||
224 !tb
[RDMA_NLDEV_ATTR_RES_QP
])
227 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
228 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
229 nla_table
= tb
[RDMA_NLDEV_ATTR_RES_QP
];
231 mnl_attr_for_each_nested(nla_entry
, nla_table
) {
232 struct nlattr
*nla_line
[RDMA_NLDEV_ATTR_MAX
] = {};
234 ret
= mnl_attr_parse_nested(nla_entry
, rd_attr_cb
, nla_line
);
235 if (ret
!= MNL_CB_OK
)
238 ret
= res_qp_line(rd
, name
, idx
, nla_line
);
239 if (ret
!= MNL_CB_OK
)