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_is_filtered_attr(rd
, "lqpn", lqpn
,
107 nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]))
110 if (nla_line
[RDMA_NLDEV_ATTR_RES_PDN
])
111 pdn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]);
112 if (rd_is_filtered_attr(rd
, "pdn", pdn
,
113 nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]))
116 if (nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
])
117 rqpn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
]);
118 if (rd_is_filtered_attr(rd
, "rqpn", rqpn
,
119 nla_line
[RDMA_NLDEV_ATTR_RES_RQPN
]))
122 if (nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
])
123 rq_psn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
]);
124 if (rd_is_filtered_attr(rd
, "rq-psn", rq_psn
,
125 nla_line
[RDMA_NLDEV_ATTR_RES_RQ_PSN
]))
128 sq_psn
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]);
129 if (rd_is_filtered_attr(rd
, "sq-psn", sq_psn
,
130 nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]))
133 if (nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
])
134 path_mig_state
= mnl_attr_get_u8(
135 nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
]);
136 if (rd_is_string_filtered_attr(
137 rd
, "path-mig-state", path_mig_to_str(path_mig_state
),
138 nla_line
[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE
]))
141 type
= mnl_attr_get_u8(nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
]);
142 if (rd_is_string_filtered_attr(rd
, "type", qp_types_to_str(type
),
143 nla_line
[RDMA_NLDEV_ATTR_RES_TYPE
]))
146 state
= mnl_attr_get_u8(nla_line
[RDMA_NLDEV_ATTR_RES_STATE
]);
147 if (rd_is_string_filtered_attr(rd
, "state", qp_states_to_str(state
),
148 nla_line
[RDMA_NLDEV_ATTR_RES_STATE
]))
151 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
]) {
152 pid
= mnl_attr_get_u32(nla_line
[RDMA_NLDEV_ATTR_RES_PID
]);
153 comm
= get_task_name(pid
);
156 if (rd_is_filtered_attr(rd
, "pid", pid
,
157 nla_line
[RDMA_NLDEV_ATTR_RES_PID
]))
160 if (nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
])
161 /* discard const from mnl_attr_get_str */
162 comm
= (char *)mnl_attr_get_str(
163 nla_line
[RDMA_NLDEV_ATTR_RES_KERN_NAME
]);
166 jsonw_start_array(rd
->jw
);
168 print_link(rd
, idx
, name
, port
, nla_line
);
170 res_print_uint(rd
, "lqpn", lqpn
, nla_line
[RDMA_NLDEV_ATTR_RES_LQPN
]);
171 print_rqpn(rd
, rqpn
, nla_line
);
173 print_type(rd
, type
);
174 print_state(rd
, state
);
176 print_rqpsn(rd
, rq_psn
, nla_line
);
177 res_print_uint(rd
, "sq-psn", sq_psn
,
178 nla_line
[RDMA_NLDEV_ATTR_RES_SQ_PSN
]);
180 print_pathmig(rd
, path_mig_state
, nla_line
);
181 res_print_uint(rd
, "pdn", pdn
, nla_line
[RDMA_NLDEV_ATTR_RES_PDN
]);
182 res_print_uint(rd
, "pid", pid
, nla_line
[RDMA_NLDEV_ATTR_RES_PID
]);
183 print_comm(rd
, comm
, nla_line
);
185 print_driver_table(rd
, nla_line
[RDMA_NLDEV_ATTR_DRIVER
]);
188 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
])
193 int res_qp_idx_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
195 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
196 struct rd
*rd
= data
;
200 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
201 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
])
204 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
205 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
207 return res_qp_line(rd
, name
, idx
, tb
);
210 int res_qp_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
212 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
213 struct nlattr
*nla_table
, *nla_entry
;
214 struct rd
*rd
= data
;
219 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
220 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
] ||
221 !tb
[RDMA_NLDEV_ATTR_RES_QP
])
224 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
225 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
226 nla_table
= tb
[RDMA_NLDEV_ATTR_RES_QP
];
228 mnl_attr_for_each_nested(nla_entry
, nla_table
) {
229 struct nlattr
*nla_line
[RDMA_NLDEV_ATTR_MAX
] = {};
231 ret
= mnl_attr_parse_nested(nla_entry
, rd_attr_cb
, nla_line
);
232 if (ret
!= MNL_CB_OK
)
235 ret
= res_qp_line(rd
, name
, idx
, nla_line
);
236 if (ret
!= MNL_CB_OK
)