From: Maor Gottlieb <maorg@xxxxxxxxxxxx> Add 'raw' argument to get the resource in raw format. When RDMA_NLDEV_ATTR_RES_RAW is set in the netlink message, then the resource fields are in raw format, print it as byte array. Example: $rdma res show qp link rocep0s12f0/1 lqpn 1137 -j -r [{"ifindex":7,"ifname":"mlx5_1","port":1,"lqpn":265,"pid":24336 "comm":"ibv_rc_pingpong","data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...]}] Signed-off-by: Maor Gottlieb <maorg@xxxxxxxxxxxx> Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> --- man/man8/rdma-resource.8 | 5 +++++ man/man8/rdma.8 | 4 ++++ rdma/rdma.c | 8 +++++++- rdma/rdma.h | 7 +++++-- rdma/res-qp.c | 37 ++++++++++++++++++++++++++++++++----- rdma/res.c | 1 + rdma/utils.c | 20 ++++++++++++++++++++ 7 files changed, 74 insertions(+), 8 deletions(-) diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8 index 05030d0a..8d0d14c6 100644 --- a/man/man8/rdma-resource.8 +++ b/man/man8/rdma-resource.8 @@ -83,6 +83,11 @@ rdma res show qp link mlx5_4/1 lqpn 0-6 Limit to specific Local QPNs. .RE .PP +rdma res show qp link mlx5_4/1 lqpn 6 -r +.RS 4 +Driver specific details in raw format. +.RE +.PP rdma resource show cm_id dst-port 7174 .RS 4 Show CM_IDs with destination ip port of 7174. diff --git a/man/man8/rdma.8 b/man/man8/rdma.8 index 221bf334..c9e5d50d 100644 --- a/man/man8/rdma.8 +++ b/man/man8/rdma.8 @@ -51,6 +51,10 @@ If there were any errors during execution of the commands, the application retur .BR "\-d" , " --details" Output detailed information. Adding a second \-d includes driver-specific details. +.TP +.BR "\-r" , " --raw" +Output includes driver-specific details in raw format. + .TP .BR "\-p" , " --pretty" When combined with -j generate a pretty JSON output. diff --git a/rdma/rdma.c b/rdma/rdma.c index 22050555..19fadeb5 100644 --- a/rdma/rdma.c +++ b/rdma/rdma.c @@ -112,6 +112,7 @@ int main(int argc, char **argv) { "json", no_argument, NULL, 'j' }, { "pretty", no_argument, NULL, 'p' }, { "details", no_argument, NULL, 'd' }, + { "raw", no_argument, NULL, 'r' }, { "force", no_argument, NULL, 'f' }, { "batch", required_argument, NULL, 'b' }, { NULL, 0, NULL, 0 } @@ -120,6 +121,7 @@ int main(int argc, char **argv) const char *batch_file = NULL; bool show_details = false; bool json_output = false; + bool show_raw = false; bool force = false; struct rd rd = {}; char *filename; @@ -127,7 +129,7 @@ int main(int argc, char **argv) int err; filename = basename(argv[0]); - while ((opt = getopt_long(argc, argv, ":Vhdpjfb:", + while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:", long_options, NULL)) >= 0) { switch (opt) { case 'V': @@ -143,6 +145,9 @@ int main(int argc, char **argv) else show_details = true; break; + case 'r': + show_raw = true; + break; case 'j': json_output = 1; break; @@ -172,6 +177,7 @@ int main(int argc, char **argv) rd.show_driver_details = show_driver_details; rd.json_output = json_output; rd.pretty_output = pretty; + rd.show_raw = show_raw; err = rd_init(&rd, filename); if (err) diff --git a/rdma/rdma.h b/rdma/rdma.h index 735b1bf7..a6c6bdea 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -57,8 +57,9 @@ struct rd { int argc; char **argv; char *filename; - bool show_details; - bool show_driver_details; + uint8_t show_details:1; + uint8_t show_driver_details:1; + uint8_t show_raw:1; struct list_head dev_map_list; uint32_t dev_idx; uint32_t port_idx; @@ -134,9 +135,11 @@ int rd_attr_check(const struct nlattr *attr, int *typep); * Print helpers */ void print_driver_table(struct rd *rd, struct nlattr *tb); +void print_raw_data(struct rd *rd, struct nlattr **nla_line); void newline(struct rd *rd); void newline_indent(struct rd *rd); void print_on_off(struct rd *rd, const char *key_str, bool on); +void print_raw_data(struct rd *rd, struct nlattr **nla_line); #define MAX_LINE_LENGTH 80 #endif /* _RDMA_TOOL_H_ */ diff --git a/rdma/res-qp.c b/rdma/res-qp.c index b36b7289..f5e36439 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -71,16 +71,38 @@ struct res_qp_info { char *comm; }; -static bool resp_is_valid(struct nlattr **nla_line) +static bool resp_is_valid(struct nlattr **nla_line, bool raw) { - if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || - !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || + if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) + return false; + + if (raw) + return nla_line[RDMA_NLDEV_ATTR_RES_RAW] ? true : false; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] || !nla_line[RDMA_NLDEV_ATTR_RES_STATE]) return false; + return true; } +static void res_qp_line_raw(struct rd *rd, const char *name, int idx, + struct nlattr **nla_line, + struct res_qp_info *info) +{ + open_json_object(NULL); + print_link(rd, idx, name, info->port, nla_line); + res_print_uint(rd, "lqpn", info->lqpn, + nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + + res_print_uint(rd, "pid", info->pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(rd, info->comm, nla_line); + + print_raw_data(rd, nla_line); + newline(rd); +} + static void res_qp_line_query(struct rd *rd, const char *name, int idx, struct nlattr **nla_line, struct res_qp_info *info) @@ -156,8 +178,9 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, struct nlattr **nla_line) { struct res_qp_info info = {}; + bool raw = rd->show_raw; - if (!resp_is_valid(nla_line)) + if (!resp_is_valid(nla_line, raw)) return MNL_CB_ERROR; if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) @@ -187,7 +210,11 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, info.comm = (char *)mnl_attr_get_str(line); } - res_qp_line_query(rd, name, idx, nla_line, &info); + if (raw) + res_qp_line_raw(rd, name, idx, nla_line, &info); + else + res_qp_line_query(rd, name, idx, nla_line, &info); + out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) free(info.comm); diff --git a/rdma/res.c b/rdma/res.c index 251f5041..759a1151 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -97,6 +97,7 @@ int _res_send_idx_msg(struct rd *rd, uint32_t command, mnl_cb_t callback, mnl_attr_put_u32(rd->nlh, id, idx); + mnl_attr_put_u8(rd->nlh, RDMA_NLDEV_ATTR_RES_RAW, rd->show_raw); if (command == RDMA_NLDEV_CMD_STAT_GET) mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES, RDMA_NLDEV_ATTR_RES_MR); diff --git a/rdma/utils.c b/rdma/utils.c index e25c3adf..4d3de4fa 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -450,6 +450,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_STAT_RES] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_DEV_DIM] = MNL_TYPE_U8, + [RDMA_NLDEV_ATTR_RES_RAW] = MNL_TYPE_BINARY, }; int rd_attr_check(const struct nlattr *attr, int *typep) @@ -890,6 +891,25 @@ static int print_driver_entry(struct rd *rd, struct nlattr *key_attr, return ret; } +void print_raw_data(struct rd *rd, struct nlattr **nla_line) +{ + uint8_t *data; + uint32_t len; + int i = 0; + + if (!rd->show_raw) + return; + + len = mnl_attr_get_payload_len(nla_line[RDMA_NLDEV_ATTR_RES_RAW]); + data = mnl_attr_get_payload(nla_line[RDMA_NLDEV_ATTR_RES_RAW]); + open_json_array(PRINT_JSON, "data"); + while (i < len) { + print_color_uint(PRINT_ANY, COLOR_NONE, NULL, "%d", data[i]); + i++; + } + close_json_array(PRINT_ANY, ">"); +} + void print_driver_table(struct rd *rd, struct nlattr *tb) { int print_type = RDMA_NLDEV_PRINT_TYPE_UNSPEC; -- 2.26.2