4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
9 * Authors: Leon Romanovsky <leonro@mellanox.com>
15 static int res_help(struct rd
*rd
)
17 pr_out("Usage: %s resource\n", rd
->filename
);
18 pr_out(" resource show [DEV]\n");
19 pr_out(" resource show [qp|cm_id|pd|mr|cq]\n");
20 pr_out(" resource show qp link [DEV/PORT]\n");
21 pr_out(" resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
22 pr_out(" resource show cm_id link [DEV/PORT]\n");
23 pr_out(" resource show cm_id link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
24 pr_out(" resource show cq link [DEV/PORT]\n");
25 pr_out(" resource show cq link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
26 pr_out(" resource show pd dev [DEV]\n");
27 pr_out(" resource show pd dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
28 pr_out(" resource show mr dev [DEV]\n");
29 pr_out(" resource show mr dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
33 static int res_print_summary(struct rd
*rd
, struct nlattr
**tb
)
35 struct nlattr
*nla_table
= tb
[RDMA_NLDEV_ATTR_RES_SUMMARY
];
36 struct nlattr
*nla_entry
;
41 mnl_attr_for_each_nested(nla_entry
, nla_table
) {
42 struct nlattr
*nla_line
[RDMA_NLDEV_ATTR_MAX
] = {};
45 err
= mnl_attr_parse_nested(nla_entry
, rd_attr_cb
, nla_line
);
49 if (!nla_line
[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME
] ||
50 !nla_line
[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR
]) {
54 name
= mnl_attr_get_str(nla_line
[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME
]);
55 curr
= mnl_attr_get_u64(nla_line
[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR
]);
56 if (rd
->json_output
) {
57 snprintf(json_name
, 32, "%s", name
);
58 jsonw_lluint_field(rd
->jw
, json_name
, curr
);
60 pr_out("%s %"PRId64
" ", name
, curr
);
66 static int res_no_args_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
68 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
73 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
74 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] ||
75 !tb
[RDMA_NLDEV_ATTR_DEV_NAME
] ||
76 !tb
[RDMA_NLDEV_ATTR_RES_SUMMARY
])
79 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
80 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
81 if (rd
->json_output
) {
82 jsonw_uint_field(rd
->jw
, "ifindex", idx
);
83 jsonw_string_field(rd
->jw
, "ifname", name
);
85 pr_out("%u: %s: ", idx
, name
);
88 res_print_summary(rd
, tb
);
95 int _res_send_msg(struct rd
*rd
, uint32_t command
, mnl_cb_t callback
)
97 uint32_t flags
= NLM_F_REQUEST
| NLM_F_ACK
;
101 if (command
!= RDMA_NLDEV_CMD_RES_GET
)
104 rd_prepare_msg(rd
, command
, &seq
, flags
);
105 mnl_attr_put_u32(rd
->nlh
, RDMA_NLDEV_ATTR_DEV_INDEX
, rd
->dev_idx
);
107 mnl_attr_put_u32(rd
->nlh
,
108 RDMA_NLDEV_ATTR_PORT_INDEX
, rd
->port_idx
);
110 ret
= rd_send_msg(rd
);
115 jsonw_start_object(rd
->jw
);
116 ret
= rd_recv_msg(rd
, callback
, rd
, seq
);
118 jsonw_end_object(rd
->jw
);
122 const char *qp_types_to_str(uint8_t idx
)
124 static const char * const qp_types_str
[] = { "SMI", "GSI", "RC",
125 "UC", "UD", "RAW_IPV6",
127 "UNKNOWN", "RAW_PACKET",
128 "XRC_INI", "XRC_TGT" };
130 if (idx
< ARRAY_SIZE(qp_types_str
))
131 return qp_types_str
[idx
];
135 void print_lqpn(struct rd
*rd
, uint32_t val
)
138 jsonw_uint_field(rd
->jw
, "lqpn", val
);
140 pr_out("lqpn %u ", val
);
143 void print_pid(struct rd
*rd
, uint32_t val
)
146 jsonw_uint_field(rd
->jw
, "pid", val
);
148 pr_out("pid %u ", val
);
151 void print_comm(struct rd
*rd
, const char *str
, struct nlattr
**nla_line
)
155 if (rd
->json_output
) {
156 /* Don't beatify output in JSON format */
157 jsonw_string_field(rd
->jw
, "comm", str
);
161 if (nla_line
[RDMA_NLDEV_ATTR_RES_PID
])
162 snprintf(tmp
, sizeof(tmp
), "%s", str
);
164 snprintf(tmp
, sizeof(tmp
), "[%s]", str
);
166 pr_out("comm %s ", tmp
);
169 void print_dev(struct rd
*rd
, uint32_t idx
, const char *name
)
171 if (rd
->json_output
) {
172 jsonw_uint_field(rd
->jw
, "ifindex", idx
);
173 jsonw_string_field(rd
->jw
, "ifname", name
);
175 pr_out("dev %s ", name
);
179 void print_link(struct rd
*rd
, uint32_t idx
, const char *name
, uint32_t port
,
180 struct nlattr
**nla_line
)
182 if (rd
->json_output
) {
183 jsonw_uint_field(rd
->jw
, "ifindex", idx
);
185 if (nla_line
[RDMA_NLDEV_ATTR_PORT_INDEX
])
186 jsonw_uint_field(rd
->jw
, "port", port
);
188 jsonw_string_field(rd
->jw
, "ifname", name
);
190 if (nla_line
[RDMA_NLDEV_ATTR_PORT_INDEX
])
191 pr_out("link %s/%u ", name
, port
);
193 pr_out("link %s/- ", name
);
197 char *get_task_name(uint32_t pid
)
202 if (asprintf(&comm
, "/proc/%d/comm", pid
) < 0)
205 f
= fopen(comm
, "r");
210 if (fscanf(f
, "%ms\n", &comm
) != 1)
218 void print_key(struct rd
*rd
, const char *name
, uint64_t val
)
221 jsonw_xint_field(rd
->jw
, name
, val
);
223 pr_out("%s 0x%" PRIx64
" ", name
, val
);
226 void res_print_uint(struct rd
*rd
, const char *name
, uint64_t val
)
229 jsonw_uint_field(rd
->jw
, name
, val
);
231 pr_out("%s %" PRIu64
" ", name
, val
);
234 void print_users(struct rd
*rd
, uint64_t val
)
237 jsonw_uint_field(rd
->jw
, "users", val
);
239 pr_out("users %" PRIu64
" ", val
);
242 RES_FUNC(res_no_args
, RDMA_NLDEV_CMD_RES_GET
, NULL
, true);
244 static int res_show(struct rd
*rd
)
246 const struct rd_cmd cmds
[] = {
247 { NULL
, res_no_args
},
249 { "cm_id", res_cm_id
},
257 * Special case to support "rdma res show DEV_NAME"
259 if (rd_argc(rd
) == 1 && dev_map_lookup(rd
, false))
260 return rd_exec_dev(rd
, _res_no_args
);
262 return rd_exec_cmd(rd
, cmds
, "parameter");
265 int cmd_res(struct rd
*rd
)
267 const struct rd_cmd cmds
[] = {
269 { "show", res_show
},
270 { "list", res_show
},
271 { "help", res_help
},
275 return rd_exec_cmd(rd
, cmds
, "resource command");