All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 iproute2 0/6] rdma: print related patches
@ 2024-01-04  1:13 Stephen Hemminger
  2024-01-04  1:13 ` [PATCH v2 iproute2 1/6] rdma: shorten print_ lines Stephen Hemminger
                   ` (8 more replies)
  0 siblings, 9 replies; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

This set of patches makes rdma comman behave more like the
other commands in iproute2 around printing flags.
There are some other things found while looking at that code.

This version keeps similar function names to original

Stephen Hemminger (6):
  rdma: shorten print_ lines
  rdma: use standard flag for json
  rdma: make pretty behave like other commands
  rdma: make supress_errors a bit
  rdma: add oneline flag
  rdma: do not mix newline and json object

 man/man8/rdma.8 | 12 ++++++--
 rdma/dev.c      | 42 +++++++++++++++-------------
 rdma/link.c     | 52 +++++++++++++++++-----------------
 rdma/rdma.c     | 21 +++++++++-----
 rdma/rdma.h     | 11 ++++----
 rdma/res-cmid.c | 37 ++++++++++++-------------
 rdma/res-cq.c   | 34 +++++++++++------------
 rdma/res-ctx.c  | 11 ++++----
 rdma/res-mr.c   | 26 +++++++++--------
 rdma/res-pd.c   | 21 +++++++-------
 rdma/res-qp.c   | 50 ++++++++++++++++-----------------
 rdma/res-srq.c  | 27 +++++++++---------
 rdma/res.c      | 39 +++++++++++---------------
 rdma/res.h      | 18 +++++-------
 rdma/stat-mr.c  | 10 +++----
 rdma/stat.c     | 70 +++++++++++++++++++++-------------------------
 rdma/stat.h     |  4 +--
 rdma/sys.c      | 11 +++-----
 rdma/utils.c    | 74 +++++++++++++++++++++++--------------------------
 19 files changed, 277 insertions(+), 293 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 iproute2 1/6] rdma: shorten print_ lines
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
@ 2024-01-04  1:13 ` Stephen Hemminger
  2024-01-04 11:28   ` Petr Machata
  2024-01-04  1:13 ` [PATCH v2 iproute2 2/6] rdma: use standard flag for json Stephen Hemminger
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

With the shorter form of print_ function some of the lines can
now be shortened. Max line length in iproute2 should be 100 characters
or less.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 rdma/dev.c     |  6 ++----
 rdma/link.c    | 16 ++++++----------
 rdma/res-cq.c  |  3 +--
 rdma/res-qp.c  |  9 +++------
 rdma/res-srq.c |  3 +--
 rdma/res.c     | 11 ++++-------
 rdma/stat.c    | 20 +++++++-------------
 rdma/sys.c     | 10 +++-------
 rdma/utils.c   | 15 +++++----------
 9 files changed, 32 insertions(+), 61 deletions(-)

diff --git a/rdma/dev.c b/rdma/dev.c
index e3483482c823..7496162df9e2 100644
--- a/rdma/dev.c
+++ b/rdma/dev.c
@@ -144,8 +144,7 @@ static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
 	sys_image_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID]);
 	memcpy(vp, &sys_image_guid, sizeof(uint64_t));
 	snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]);
-	print_string(PRINT_ANY, "sys_image_guid",
-			   "sys_image_guid %s ", str);
+	print_string(PRINT_ANY, "sys_image_guid", "sys_image_guid %s ", str);
 }
 
 static void dev_print_dim_setting(struct rd *rd, struct nlattr **tb)
@@ -185,8 +184,7 @@ static void dev_print_node_type(struct rd *rd, struct nlattr **tb)
 
 	node_type = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE]);
 	node_str = node_type_to_str(node_type);
-	print_string(PRINT_ANY, "node_type", "node_type %s ",
-			   node_str);
+	print_string(PRINT_ANY, "node_type", "node_type %s ", node_str);
 }
 
 static void dev_print_dev_proto(struct rd *rd, struct nlattr **tb)
diff --git a/rdma/link.c b/rdma/link.c
index 913186cbfd73..48f7b0877468 100644
--- a/rdma/link.c
+++ b/rdma/link.c
@@ -120,8 +120,7 @@ static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb)
 	subnet_prefix = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]);
 	memcpy(vp, &subnet_prefix, sizeof(uint64_t));
 	snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]);
-	print_string(PRINT_ANY, "subnet_prefix",
-			   "subnet_prefix %s ", str);
+	print_string(PRINT_ANY, "subnet_prefix", "subnet_prefix %s ", str);
 }
 
 static void link_print_lid(struct rd *rd, struct nlattr **tb)
@@ -176,8 +175,7 @@ static void link_print_state(struct rd *rd, struct nlattr **tb)
 		return;
 
 	state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_STATE]);
-	print_string(PRINT_ANY, "state", "state %s ",
-			   link_state_to_str(state));
+	print_string(PRINT_ANY, "state", "state %s ", link_state_to_str(state));
 }
 
 static const char *phys_state_to_str(uint8_t phys_state)
@@ -202,8 +200,8 @@ static void link_print_phys_state(struct rd *rd, struct nlattr **tb)
 		return;
 
 	phys_state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]);
-	print_string(PRINT_ANY, "physical_state",
-			   "physical_state %s ", phys_state_to_str(phys_state));
+	print_string(PRINT_ANY, "physical_state", "physical_state %s ",
+		     phys_state_to_str(phys_state));
 }
 
 static void link_print_netdev(struct rd *rd, struct nlattr **tb)
@@ -216,10 +214,8 @@ static void link_print_netdev(struct rd *rd, struct nlattr **tb)
 
 	netdev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_NDEV_NAME]);
 	idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_NDEV_INDEX]);
-	print_string(PRINT_ANY, "netdev", "netdev %s ",
-			   netdev_name);
-	print_uint(PRINT_ANY, "netdev_index",
-			 rd->show_details ? "netdev_index %u " : "", idx);
+	print_string(PRINT_ANY, "netdev", "netdev %s ", netdev_name);
+	print_uint(PRINT_ANY, "netdev_index", rd->show_details ? "netdev_index %u " : "", idx);
 }
 
 static int link_parse_cb(const struct nlmsghdr *nlh, void *data)
diff --git a/rdma/res-cq.c b/rdma/res-cq.c
index 9656773ffe6e..b4dcc026ed4b 100644
--- a/rdma/res-cq.c
+++ b/rdma/res-cq.c
@@ -21,8 +21,7 @@ static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr)
 {
 	if (!attr)
 		return;
-	print_string(PRINT_ANY, "poll-ctx", "poll-ctx %s ",
-			   poll_ctx_to_str(poll_ctx));
+	print_string(PRINT_ANY, "poll-ctx", "poll-ctx %s ", poll_ctx_to_str(poll_ctx));
 }
 
 static void print_cq_dim_setting(struct rd *rd, struct nlattr *attr)
diff --git a/rdma/res-qp.c b/rdma/res-qp.c
index ef062c764c06..2390c0b5732b 100644
--- a/rdma/res-qp.c
+++ b/rdma/res-qp.c
@@ -37,14 +37,12 @@ static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
 
 static void print_type(struct rd *rd, uint32_t val)
 {
-	print_string(PRINT_ANY, "type", "type %s ",
-			   qp_types_to_str(val));
+	print_string(PRINT_ANY, "type", "type %s ", qp_types_to_str(val));
 }
 
 static void print_state(struct rd *rd, uint32_t val)
 {
-	print_string(PRINT_ANY, "state", "state %s ",
-			   qp_states_to_str(val));
+	print_string(PRINT_ANY, "state", "state %s ", qp_states_to_str(val));
 }
 
 static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
@@ -60,8 +58,7 @@ static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line)
 	if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
 		return;
 
-	print_string(PRINT_ANY, "path-mig-state",
-			   "path-mig-state %s ", path_mig_to_str(val));
+	print_string(PRINT_ANY, "path-mig-state", "path-mig-state %s ", path_mig_to_str(val));
 }
 
 static int res_qp_line_raw(struct rd *rd, const char *name, int idx,
diff --git a/rdma/res-srq.c b/rdma/res-srq.c
index 714abb96711a..e702fecd1f34 100644
--- a/rdma/res-srq.c
+++ b/rdma/res-srq.c
@@ -22,8 +22,7 @@ static const char *srq_types_to_str(uint8_t idx)
 
 static void print_type(struct rd *rd, uint32_t val)
 {
-	print_string(PRINT_ANY, "type", "type %s ",
-			   srq_types_to_str(val));
+	print_string(PRINT_ANY, "type", "type %s ", srq_types_to_str(val));
 }
 
 static void print_qps(char *qp_str)
diff --git a/rdma/res.c b/rdma/res.c
index b0efcd95f4fe..715cf93c4fab 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -51,9 +51,8 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb)
 
 		name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]);
 		curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
-		res_print_u64(
-			rd, name, curr,
-			nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
+		res_print_u64(rd, name, curr,
+			      nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
 	}
 	return 0;
 }
@@ -189,14 +188,12 @@ void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
 	}
 
 	if (!rd->json_output)
-		print_string(PRINT_ANY, NULL, "link %s ",
-				   tmp);
+		print_string(PRINT_ANY, NULL, "link %s ", tmp);
 }
 
 void print_qp_type(struct rd *rd, uint32_t val)
 {
-	print_string(PRINT_ANY, "qp-type", "qp-type %s ",
-			   qp_types_to_str(val));
+	print_string(PRINT_ANY, "qp-type", "qp-type %s ", qp_types_to_str(val));
 }
 
 void print_key(struct rd *rd, const char *name, uint64_t val,
diff --git a/rdma/stat.c b/rdma/stat.c
index 53d829e9ccf8..28b1ad857219 100644
--- a/rdma/stat.c
+++ b/rdma/stat.c
@@ -304,8 +304,7 @@ static int res_counter_line(struct rd *rd, const char *name, int index,
 
 		qpn = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_RES_LQPN]);
 		if (!isfirst)
-			print_string(PRINT_FP, NULL, ",",
-					   NULL);
+			print_string(PRINT_FP, NULL, ",", NULL);
 		print_uint(PRINT_ANY, NULL, "%d", qpn);
 		isfirst = false;
 	}
@@ -790,28 +789,23 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
 		if (supported || enabled) {
 			if (isfirst) {
 				open_json_object(NULL);
-				print_string(PRINT_ANY,
-						   "ifname", "link %s/", dev);
-				print_uint(PRINT_ANY, "port",
-						 "%u ", port);
+				print_string(PRINT_ANY, "ifname", "link %s/", dev);
+				print_uint(PRINT_ANY, "port", "%u ", port);
 				if (supported)
 					open_json_array(PRINT_ANY,
-						"supported optional-counters");
+							"supported optional-counters");
 				else
 					open_json_array(PRINT_ANY,
 							"optional-counters");
-				print_string(PRINT_FP, NULL,
-						   " ", NULL);
+				print_string(PRINT_FP, NULL, " ", NULL);
 				isfirst = false;
 			} else {
-				print_string(PRINT_FP, NULL,
-						   ",", NULL);
+				print_string(PRINT_FP, NULL, ",", NULL);
 			}
 			if (rd->pretty_output && !rd->json_output)
 				newline_indent(rd);
 
-			print_string(PRINT_ANY, NULL, "%s",
-					   name);
+			print_string(PRINT_ANY, NULL, "%s", name);
 		}
 	}
 
diff --git a/rdma/sys.c b/rdma/sys.c
index d7403a24027d..7bb0edbfec2b 100644
--- a/rdma/sys.c
+++ b/rdma/sys.c
@@ -36,8 +36,7 @@ static int sys_show_parse_cb(const struct nlmsghdr *nlh, void *data)
 		else
 			mode_str = "unknown";
 
-		print_string(PRINT_ANY, "netns", "netns %s ",
-				   mode_str);
+		print_string(PRINT_ANY, "netns", "netns %s ", mode_str);
 	}
 
 	if (tb[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE]) {
@@ -45,17 +44,14 @@ static int sys_show_parse_cb(const struct nlmsghdr *nlh, void *data)
 
 		mode = mnl_attr_get_u8(tb[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE]);
 
-		print_on_off(PRINT_ANY, "privileged-qkey",
-				   "privileged-qkey %s ", mode);
+		print_on_off(PRINT_ANY, "privileged-qkey", "privileged-qkey %s ", mode);
 
 	}
 
 	if (tb[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK])
 		cof = mnl_attr_get_u8(tb[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK]);
 
-	print_on_off(PRINT_ANY, "copy-on-fork",
-			   "copy-on-fork %s\n",
-			   cof);
+	print_on_off(PRINT_ANY, "copy-on-fork", "copy-on-fork %s\n", cof);
 
 	return MNL_CB_OK;
 }
diff --git a/rdma/utils.c b/rdma/utils.c
index d647813c37fa..f73a9f19b617 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -872,24 +872,19 @@ static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
 
 	switch (attr_type) {
 	case RDMA_NLDEV_ATTR_DRIVER_STRING:
-		ret = print_driver_string(rd, key_str,
-					  mnl_attr_get_str(val_attr));
+		ret = print_driver_string(rd, key_str, mnl_attr_get_str(val_attr));
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_S32:
-		ret = print_driver_s32(rd, key_str, mnl_attr_get_u32(val_attr),
-				       print_type);
+		ret = print_driver_s32(rd, key_str, mnl_attr_get_u32(val_attr), print_type);
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_U32:
-		ret = print_driver_u32(rd, key_str, mnl_attr_get_u32(val_attr),
-				       print_type);
+		ret = print_driver_u32(rd, key_str, mnl_attr_get_u32(val_attr), print_type);
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_S64:
-		ret = print_driver_s64(rd, key_str, mnl_attr_get_u64(val_attr),
-				       print_type);
+		ret = print_driver_s64(rd, key_str, mnl_attr_get_u64(val_attr), print_type);
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_U64:
-		ret = print_driver_u64(rd, key_str, mnl_attr_get_u64(val_attr),
-				       print_type);
+		ret = print_driver_u64(rd, key_str, mnl_attr_get_u64(val_attr), print_type);
 		break;
 	}
 	free(key_str);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 iproute2 2/6] rdma: use standard flag for json
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
  2024-01-04  1:13 ` [PATCH v2 iproute2 1/6] rdma: shorten print_ lines Stephen Hemminger
@ 2024-01-04  1:13 ` Stephen Hemminger
  2024-01-04 12:07   ` Petr Machata
  2024-01-04  1:13 ` [PATCH v2 iproute2 3/6] rdma: make pretty behave like other commands Stephen Hemminger
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

The other iproute2 utils use variable json as flag.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 rdma/rdma.c  |  7 ++++---
 rdma/rdma.h  |  1 -
 rdma/res.c   |  5 ++---
 rdma/stat.c  |  4 ++--
 rdma/utils.c | 12 ++++++------
 5 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/rdma/rdma.c b/rdma/rdma.c
index 8dc2d3e344be..60ba8c0e5594 100644
--- a/rdma/rdma.c
+++ b/rdma/rdma.c
@@ -8,6 +8,9 @@
 #include "version.h"
 #include "color.h"
 
+/* Global utils flags */
+int json;
+
 static void help(char *name)
 {
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
@@ -96,7 +99,6 @@ int main(int argc, char **argv)
 	bool show_driver_details = false;
 	const char *batch_file = NULL;
 	bool show_details = false;
-	bool json_output = false;
 	bool show_raw = false;
 	bool force = false;
 	struct rd rd = {};
@@ -125,7 +127,7 @@ int main(int argc, char **argv)
 			show_raw = true;
 			break;
 		case 'j':
-			json_output = 1;
+			++json;
 			break;
 		case 'f':
 			force = true;
@@ -151,7 +153,6 @@ int main(int argc, char **argv)
 
 	rd.show_details = show_details;
 	rd.show_driver_details = show_driver_details;
-	rd.json_output = json_output;
 	rd.pretty_output = pretty;
 	rd.show_raw = show_raw;
 
diff --git a/rdma/rdma.h b/rdma/rdma.h
index 0bf77f4dcf9e..f6830c851fb1 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -68,7 +68,6 @@ struct rd {
 	struct nlmsghdr *nlh;
 	char *buff;
 	json_writer_t *jw;
-	int json_output;
 	int pretty_output;
 	bool suppress_errors;
 	struct list_head filter_list;
diff --git a/rdma/res.c b/rdma/res.c
index 715cf93c4fab..f64224e1f3eb 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -160,7 +160,7 @@ void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line)
 	if (!str)
 		return;
 
-	if (nla_line[RDMA_NLDEV_ATTR_RES_PID] || rd->json_output)
+	if (nla_line[RDMA_NLDEV_ATTR_RES_PID] || is_json_context())
 		snprintf(tmp, sizeof(tmp), "%s", str);
 	else
 		snprintf(tmp, sizeof(tmp), "[%s]", str);
@@ -187,8 +187,7 @@ void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
 		snprintf(tmp, sizeof(tmp), "%s/-", name);
 	}
 
-	if (!rd->json_output)
-		print_string(PRINT_ANY, NULL, "link %s ", tmp);
+	print_string(PRINT_FP, NULL, "link %s ", tmp);
 }
 
 void print_qp_type(struct rd *rd, uint32_t val)
diff --git a/rdma/stat.c b/rdma/stat.c
index 28b1ad857219..6a3f8ca44892 100644
--- a/rdma/stat.c
+++ b/rdma/stat.c
@@ -208,7 +208,7 @@ int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
 
 		nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
 		v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]);
-		if (rd->pretty_output && !rd->json_output)
+		if (rd->pretty_output)
 			newline_indent(rd);
 		res_print_u64(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
 	}
@@ -802,7 +802,7 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
 			} else {
 				print_string(PRINT_FP, NULL, ",", NULL);
 			}
-			if (rd->pretty_output && !rd->json_output)
+			if (rd->pretty_output)
 				newline_indent(rd);
 
 			print_string(PRINT_ANY, NULL, "%s", name);
diff --git a/rdma/utils.c b/rdma/utils.c
index f73a9f19b617..32e12a64193a 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -572,7 +572,7 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
 	uint32_t port;
 	int ret = 0;
 
-	new_json_obj(rd->json_output);
+	new_json_obj(json);
 	if (rd_no_arg(rd)) {
 		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
 			rd->dev_idx = dev_map->idx;
@@ -621,7 +621,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd))
 	struct dev_map *dev_map;
 	int ret = 0;
 
-	new_json_obj(rd->json_output);
+	new_json_obj(json);
 	if (rd_no_arg(rd)) {
 		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
 			rd->dev_idx = dev_map->idx;
@@ -794,7 +794,7 @@ static int print_driver_string(struct rd *rd, const char *key_str,
 static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
 			      enum rdma_nldev_print_type print_type)
 {
-	if (!rd->json_output) {
+	if (!is_json_context()) {
 		switch (print_type) {
 		case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
 			return pr_out("%s %d ", key_str, val);
@@ -811,7 +811,7 @@ static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
 static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
 			      enum rdma_nldev_print_type print_type)
 {
-	if (!rd->json_output) {
+	if (!is_json_context()) {
 		switch (print_type) {
 		case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
 			return pr_out("%s %u ", key_str, val);
@@ -828,7 +828,7 @@ static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
 static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
 			      enum rdma_nldev_print_type print_type)
 {
-	if (!rd->json_output) {
+	if (!is_json_context()) {
 		switch (print_type) {
 		case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
 			return pr_out("%s %" PRId64 " ", key_str, val);
@@ -845,7 +845,7 @@ static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
 static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val,
 			      enum rdma_nldev_print_type print_type)
 {
-	if (!rd->json_output) {
+	if (!is_json_context()) {
 		switch (print_type) {
 		case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
 			return pr_out("%s %" PRIu64 " ", key_str, val);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 iproute2 3/6] rdma: make pretty behave like other commands
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
  2024-01-04  1:13 ` [PATCH v2 iproute2 1/6] rdma: shorten print_ lines Stephen Hemminger
  2024-01-04  1:13 ` [PATCH v2 iproute2 2/6] rdma: use standard flag for json Stephen Hemminger
@ 2024-01-04  1:13 ` Stephen Hemminger
  2024-01-04  1:13 ` [PATCH v2 iproute2 4/6] rdma: make supress_errors a bit Stephen Hemminger
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

For tc, ip, etc the -pretty flag only has meaning if json
is used.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 rdma/rdma.c  | 3 +--
 rdma/rdma.h  | 1 -
 rdma/stat.c  | 6 ++----
 rdma/utils.c | 6 ++----
 4 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/rdma/rdma.c b/rdma/rdma.c
index 60ba8c0e5594..bee1985f96d8 100644
--- a/rdma/rdma.c
+++ b/rdma/rdma.c
@@ -115,7 +115,7 @@ int main(int argc, char **argv)
 			       filename, version);
 			return EXIT_SUCCESS;
 		case 'p':
-			pretty = 1;
+			++pretty;
 			break;
 		case 'd':
 			if (show_details)
@@ -153,7 +153,6 @@ int main(int argc, char **argv)
 
 	rd.show_details = show_details;
 	rd.show_driver_details = show_driver_details;
-	rd.pretty_output = pretty;
 	rd.show_raw = show_raw;
 
 	err = rd_init(&rd, filename);
diff --git a/rdma/rdma.h b/rdma/rdma.h
index f6830c851fb1..f9308dbcfafd 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -68,7 +68,6 @@ struct rd {
 	struct nlmsghdr *nlh;
 	char *buff;
 	json_writer_t *jw;
-	int pretty_output;
 	bool suppress_errors;
 	struct list_head filter_list;
 	char *link_name;
diff --git a/rdma/stat.c b/rdma/stat.c
index 6a3f8ca44892..b428a62ac707 100644
--- a/rdma/stat.c
+++ b/rdma/stat.c
@@ -208,8 +208,7 @@ int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
 
 		nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
 		v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]);
-		if (rd->pretty_output)
-			newline_indent(rd);
+		newline_indent(rd);
 		res_print_u64(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
 	}
 
@@ -802,8 +801,7 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
 			} else {
 				print_string(PRINT_FP, NULL, ",", NULL);
 			}
-			if (rd->pretty_output)
-				newline_indent(rd);
+			newline_indent(rd);
 
 			print_string(PRINT_ANY, NULL, "%s", name);
 		}
diff --git a/rdma/utils.c b/rdma/utils.c
index 32e12a64193a..f332b2602e6f 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -920,8 +920,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
 	if (!rd->show_driver_details || !tb)
 		return;
 
-	if (rd->pretty_output)
-		newline_indent(rd);
+	newline_indent(rd);
 
 	/*
 	 * Driver attrs are tuples of {key, [print-type], value}.
@@ -933,8 +932,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
 	mnl_attr_for_each_nested(tb_entry, tb) {
 
 		if (cc > MAX_LINE_LENGTH) {
-			if (rd->pretty_output)
-				newline_indent(rd);
+			newline_indent(rd);
 			cc = 0;
 		}
 		if (rd_attr_check(tb_entry, &type) != MNL_CB_OK)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 iproute2 4/6] rdma: make supress_errors a bit
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
                   ` (2 preceding siblings ...)
  2024-01-04  1:13 ` [PATCH v2 iproute2 3/6] rdma: make pretty behave like other commands Stephen Hemminger
@ 2024-01-04  1:13 ` Stephen Hemminger
  2024-01-04 14:17   ` Petr Machata
  2024-01-04  1:13 ` [PATCH v2 iproute2 5/6] rdma: add oneline flag Stephen Hemminger
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

Like other command line flags supress_errors can be a bit.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 rdma/rdma.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/rdma/rdma.h b/rdma/rdma.h
index f9308dbcfafd..65e3557d4036 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -61,6 +61,7 @@ struct rd {
 	uint8_t show_details:1;
 	uint8_t show_driver_details:1;
 	uint8_t show_raw:1;
+	uint8_t suppress_errors:1;
 	struct list_head dev_map_list;
 	uint32_t dev_idx;
 	uint32_t port_idx;
@@ -68,7 +69,6 @@ struct rd {
 	struct nlmsghdr *nlh;
 	char *buff;
 	json_writer_t *jw;
-	bool suppress_errors;
 	struct list_head filter_list;
 	char *link_name;
 	char *link_type;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 iproute2 5/6] rdma: add oneline flag
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
                   ` (3 preceding siblings ...)
  2024-01-04  1:13 ` [PATCH v2 iproute2 4/6] rdma: make supress_errors a bit Stephen Hemminger
@ 2024-01-04  1:13 ` Stephen Hemminger
  2024-01-04 14:20   ` Petr Machata
  2024-01-04  1:13 ` [PATCH v2 iproute2 6/6] rdma: do not mix newline and json object Stephen Hemminger
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

Add oneline output format like other commands.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 man/man8/rdma.8 | 12 ++++++++++--
 rdma/dev.c      |  2 +-
 rdma/link.c     |  2 +-
 rdma/rdma.c     | 11 +++++++++--
 rdma/stat.c     |  2 +-
 rdma/sys.c      |  3 ++-
 rdma/utils.c    |  2 +-
 7 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/man/man8/rdma.8 b/man/man8/rdma.8
index c9e5d50d5ad7..5088b9ec3cf2 100644
--- a/man/man8/rdma.8
+++ b/man/man8/rdma.8
@@ -25,8 +25,9 @@ rdma \- RDMA tool
 .ti -8
 .IR OPTIONS " := { "
 \fB\-V\fR[\fIersion\fR] |
-\fB\-d\fR[\fIetails\fR] }
-\fB\-j\fR[\fIson\fR] }
+\fB\-d\fR[\fIetails\fR] |
+\fB\-j\fR[\fIson\fR] |
+\fB\-o\fR[\fIneline\fR] |
 \fB\-p\fR[\fIretty\fR] }
 
 .SH OPTIONS
@@ -63,6 +64,13 @@ When combined with -j generate a pretty JSON output.
 .BR "\-j" , " --json"
 Generate JSON output.
 
+.TP
+.BR "\-o" , " \-oneline"
+output each record on a single line, replacing line feeds
+with the
+.B '\e'
+character.
+
 .SS
 .I OBJECT
 
diff --git a/rdma/dev.c b/rdma/dev.c
index 7496162df9e2..31868c6fe43e 100644
--- a/rdma/dev.c
+++ b/rdma/dev.c
@@ -94,7 +94,7 @@ static void dev_print_caps(struct rd *rd, struct nlattr **tb)
 
 	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
 
-	print_string(PRINT_FP, NULL, "\n    caps: <", NULL);
+	print_string(PRINT_FP, NULL, "%s    caps: <", _SL_);
 	open_json_array(PRINT_JSON, "caps");
 	for (idx = 0; caps; idx++) {
 		if (caps & 0x1)
diff --git a/rdma/link.c b/rdma/link.c
index 48f7b0877468..d7d9558b49f2 100644
--- a/rdma/link.c
+++ b/rdma/link.c
@@ -96,7 +96,7 @@ static void link_print_caps(struct rd *rd, struct nlattr **tb)
 
 	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
 
-	print_string(PRINT_FP, NULL, "\n    caps: <", NULL);
+	print_string(PRINT_FP, NULL, "%s    caps: <", _SL_);
 	open_json_array(PRINT_JSON, "caps");
 	for (idx = 0; caps; idx++) {
 		if (caps & 0x1)
diff --git a/rdma/rdma.c b/rdma/rdma.c
index bee1985f96d8..131c6b2abd34 100644
--- a/rdma/rdma.c
+++ b/rdma/rdma.c
@@ -16,7 +16,7 @@ static void help(char *name)
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
 	       "       %s [ -f[orce] ] -b[atch] filename\n"
 	       "where  OBJECT := { dev | link | resource | system | statistic | help }\n"
-	       "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\n", name, name);
+	       "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] | -r[aw]}\n", name, name);
 }
 
 static int cmd_help(struct rd *rd)
@@ -89,6 +89,7 @@ int main(int argc, char **argv)
 		{ "version",		no_argument,		NULL, 'V' },
 		{ "help",		no_argument,		NULL, 'h' },
 		{ "json",		no_argument,		NULL, 'j' },
+		{ "oneline",		no_argument,            NULL, 'o' },
 		{ "pretty",		no_argument,		NULL, 'p' },
 		{ "details",		no_argument,		NULL, 'd' },
 		{ "raw",		no_argument,		NULL, 'r' },
@@ -101,13 +102,14 @@ int main(int argc, char **argv)
 	bool show_details = false;
 	bool show_raw = false;
 	bool force = false;
+	bool oneline = false;
 	struct rd rd = {};
 	char *filename;
 	int opt;
 	int err;
 	filename = basename(argv[0]);
 
-	while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:",
+	while ((opt = getopt_long(argc, argv, ":Vhdropjfb:",
 				  long_options, NULL)) >= 0) {
 		switch (opt) {
 		case 'V':
@@ -126,6 +128,9 @@ int main(int argc, char **argv)
 		case 'r':
 			show_raw = true;
 			break;
+		case 'o':
+			oneline = true;
+			break;
 		case 'j':
 			++json;
 			break;
@@ -151,6 +156,8 @@ int main(int argc, char **argv)
 	argc -= optind;
 	argv += optind;
 
+	_SL_ = oneline ? "\\" : "\n";
+
 	rd.show_details = show_details;
 	rd.show_driver_details = show_driver_details;
 	rd.show_raw = show_raw;
diff --git a/rdma/stat.c b/rdma/stat.c
index b428a62ac707..e90b6197ceb7 100644
--- a/rdma/stat.c
+++ b/rdma/stat.c
@@ -291,7 +291,7 @@ static int res_counter_line(struct rd *rd, const char *name, int index,
 	res_get_hwcounters(rd, hwc_table, true);
 	isfirst = true;
 	open_json_array(PRINT_JSON, "lqpn");
-	print_string(PRINT_FP, NULL, "\n    LQPN: <", NULL);
+	print_string(PRINT_FP, NULL, "%s    LQPN: <", _SL_);
 	mnl_attr_for_each_nested(nla_entry, qp_table) {
 		struct nlattr *qp_line[RDMA_NLDEV_ATTR_MAX] = {};
 		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, qp_line);
diff --git a/rdma/sys.c b/rdma/sys.c
index 7bb0edbfec2b..7dbe44094820 100644
--- a/rdma/sys.c
+++ b/rdma/sys.c
@@ -51,7 +51,8 @@ static int sys_show_parse_cb(const struct nlmsghdr *nlh, void *data)
 	if (tb[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK])
 		cof = mnl_attr_get_u8(tb[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK]);
 
-	print_on_off(PRINT_ANY, "copy-on-fork", "copy-on-fork %s\n", cof);
+	print_on_off(PRINT_ANY, "copy-on-fork", "copy-on-fork %s", cof);
+	print_nl();
 
 	return MNL_CB_OK;
 }
diff --git a/rdma/utils.c b/rdma/utils.c
index f332b2602e6f..aeb627be7715 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -774,7 +774,7 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index)
 void newline(struct rd *rd)
 {
 	close_json_object();
-	print_string(PRINT_FP, NULL, "\n", NULL);
+	print_nl();
 }
 
 void newline_indent(struct rd *rd)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 iproute2 6/6] rdma: do not mix newline and json object
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
                   ` (4 preceding siblings ...)
  2024-01-04  1:13 ` [PATCH v2 iproute2 5/6] rdma: add oneline flag Stephen Hemminger
@ 2024-01-04  1:13 ` Stephen Hemminger
  2024-01-04 14:29   ` Petr Machata
  2024-01-04  5:58 ` [PATCH v2 iproute2 0/6] rdma: print related patches Chengchang Tang
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2024-01-04  1:13 UTC (permalink / raw)
  To: leon; +Cc: netdev, Stephen Hemminger

Mixing the semantics of ending lines with the json object
leads to several bugs where json object is closed twice, etc.
Replace by breaking the meaning of newline() function into
two parts.

Now, lots of functions were taking the rdma data structure as
argument but never using it.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 rdma/dev.c      | 34 ++++++++++++++++--------------
 rdma/link.c     | 34 ++++++++++++++++--------------
 rdma/rdma.h     |  7 ++++---
 rdma/res-cmid.c | 37 +++++++++++++++------------------
 rdma/res-cq.c   | 31 ++++++++++++++--------------
 rdma/res-ctx.c  | 11 +++++-----
 rdma/res-mr.c   | 26 ++++++++++++-----------
 rdma/res-pd.c   | 21 +++++++++----------
 rdma/res-qp.c   | 41 ++++++++++++++++++------------------
 rdma/res-srq.c  | 24 +++++++++++----------
 rdma/res.c      | 29 ++++++++++++--------------
 rdma/res.h      | 18 +++++++---------
 rdma/stat-mr.c  | 10 ++++-----
 rdma/stat.c     | 46 +++++++++++++++++++++--------------------
 rdma/stat.h     |  4 +---
 rdma/utils.c    | 55 +++++++++++++++++++++++++------------------------
 16 files changed, 216 insertions(+), 212 deletions(-)

diff --git a/rdma/dev.c b/rdma/dev.c
index 31868c6fe43e..f495b7138b34 100644
--- a/rdma/dev.c
+++ b/rdma/dev.c
@@ -84,7 +84,7 @@ static const char *dev_caps_to_str(uint32_t idx)
 	return "UNKNOWN";
 }
 
-static void dev_print_caps(struct rd *rd, struct nlattr **tb)
+static void dev_print_caps(struct nlattr **tb)
 {
 	uint64_t caps;
 	uint32_t idx;
@@ -106,9 +106,10 @@ static void dev_print_caps(struct rd *rd, struct nlattr **tb)
 	close_json_array(PRINT_ANY, ">");
 }
 
-static void dev_print_fw(struct rd *rd, struct nlattr **tb)
+static void dev_print_fw(struct nlattr **tb)
 {
 	const char *str;
+
 	if (!tb[RDMA_NLDEV_ATTR_FW_VERSION])
 		return;
 
@@ -116,7 +117,7 @@ static void dev_print_fw(struct rd *rd, struct nlattr **tb)
 	print_string(PRINT_ANY, "fw", "fw %s ", str);
 }
 
-static void dev_print_node_guid(struct rd *rd, struct nlattr **tb)
+static void dev_print_node_guid(struct nlattr **tb)
 {
 	uint64_t node_guid;
 	uint16_t vp[4];
@@ -132,7 +133,7 @@ static void dev_print_node_guid(struct rd *rd, struct nlattr **tb)
 			   str);
 }
 
-static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
+static void dev_print_sys_image_guid(struct nlattr **tb)
 {
 	uint64_t sys_image_guid;
 	uint16_t vp[4];
@@ -147,7 +148,7 @@ static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
 	print_string(PRINT_ANY, "sys_image_guid", "sys_image_guid %s ", str);
 }
 
-static void dev_print_dim_setting(struct rd *rd, struct nlattr **tb)
+static void dev_print_dim_setting(struct nlattr **tb)
 {
 	uint8_t dim_setting;
 
@@ -174,7 +175,7 @@ static const char *node_type_to_str(uint8_t node_type)
 	return "unknown";
 }
 
-static void dev_print_node_type(struct rd *rd, struct nlattr **tb)
+static void dev_print_node_type(struct nlattr **tb)
 {
 	const char *node_str;
 	uint8_t node_type;
@@ -187,7 +188,7 @@ static void dev_print_node_type(struct rd *rd, struct nlattr **tb)
 	print_string(PRINT_ANY, "node_type", "node_type %s ", node_str);
 }
 
-static void dev_print_dev_proto(struct rd *rd, struct nlattr **tb)
+static void dev_print_dev_proto(struct nlattr **tb)
 {
 	const char *str;
 
@@ -208,23 +209,26 @@ static int dev_parse_cb(const struct nlmsghdr *nlh, void *data)
 	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
 	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
 		return MNL_CB_ERROR;
+
 	open_json_object(NULL);
 	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
 	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
 	print_uint(PRINT_ANY, "ifindex", "%u: ", idx);
 	print_string(PRINT_ANY, "ifname", "%s: ", name);
 
-	dev_print_node_type(rd, tb);
-	dev_print_dev_proto(rd, tb);
-	dev_print_fw(rd, tb);
-	dev_print_node_guid(rd, tb);
-	dev_print_sys_image_guid(rd, tb);
+	dev_print_node_type(tb);
+	dev_print_dev_proto(tb);
+	dev_print_fw(tb);
+	dev_print_node_guid(tb);
+	dev_print_sys_image_guid(tb);
 	if (rd->show_details) {
-		dev_print_dim_setting(rd, tb);
-		dev_print_caps(rd, tb);
+		dev_print_dim_setting(tb);
+		dev_print_caps(tb);
 	}
 
-	newline(rd);
+	close_json_object();
+	newline();
+
 	return MNL_CB_OK;
 }
 
diff --git a/rdma/link.c b/rdma/link.c
index d7d9558b49f2..853181733f00 100644
--- a/rdma/link.c
+++ b/rdma/link.c
@@ -86,7 +86,7 @@ static const char *caps_to_str(uint32_t idx)
 	return "UNKNOWN";
 }
 
-static void link_print_caps(struct rd *rd, struct nlattr **tb)
+static void link_print_caps(struct nlattr **tb)
 {
 	uint64_t caps;
 	uint32_t idx;
@@ -108,7 +108,7 @@ static void link_print_caps(struct rd *rd, struct nlattr **tb)
 	close_json_array(PRINT_ANY, ">");
 }
 
-static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb)
+static void link_print_subnet_prefix(struct nlattr **tb)
 {
 	uint64_t subnet_prefix;
 	uint16_t vp[4];
@@ -123,7 +123,7 @@ static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb)
 	print_string(PRINT_ANY, "subnet_prefix", "subnet_prefix %s ", str);
 }
 
-static void link_print_lid(struct rd *rd, struct nlattr **tb)
+static void link_print_lid(struct nlattr **tb)
 {
 	uint32_t lid;
 
@@ -134,7 +134,7 @@ static void link_print_lid(struct rd *rd, struct nlattr **tb)
 	print_uint(PRINT_ANY, "lid", "lid %u ", lid);
 }
 
-static void link_print_sm_lid(struct rd *rd, struct nlattr **tb)
+static void link_print_sm_lid(struct nlattr **tb)
 {
 	uint32_t sm_lid;
 
@@ -145,7 +145,7 @@ static void link_print_sm_lid(struct rd *rd, struct nlattr **tb)
 	print_uint(PRINT_ANY, "sm_lid", "sm_lid %u ", sm_lid);
 }
 
-static void link_print_lmc(struct rd *rd, struct nlattr **tb)
+static void link_print_lmc(struct nlattr **tb)
 {
 	uint8_t lmc;
 
@@ -167,7 +167,7 @@ static const char *link_state_to_str(uint8_t link_state)
 	return "UNKNOWN";
 }
 
-static void link_print_state(struct rd *rd, struct nlattr **tb)
+static void link_print_state(struct nlattr **tb)
 {
 	uint8_t state;
 
@@ -192,7 +192,7 @@ static const char *phys_state_to_str(uint8_t phys_state)
 	return "UNKNOWN";
 };
 
-static void link_print_phys_state(struct rd *rd, struct nlattr **tb)
+static void link_print_phys_state(struct nlattr **tb)
 {
 	uint8_t phys_state;
 
@@ -204,7 +204,7 @@ static void link_print_phys_state(struct rd *rd, struct nlattr **tb)
 		     phys_state_to_str(phys_state));
 }
 
-static void link_print_netdev(struct rd *rd, struct nlattr **tb)
+static void link_print_netdev(const struct rd * rd, struct nlattr **tb)
 {
 	const char *netdev_name;
 	uint32_t idx;
@@ -242,17 +242,19 @@ static int link_parse_cb(const struct nlmsghdr *nlh, void *data)
 	print_uint(PRINT_JSON, "ifindex", NULL, idx);
 	print_string(PRINT_ANY, "ifname", "link %s/", name);
 	print_uint(PRINT_ANY, "port", "%u ", port);
-	link_print_subnet_prefix(rd, tb);
-	link_print_lid(rd, tb);
-	link_print_sm_lid(rd, tb);
-	link_print_lmc(rd, tb);
-	link_print_state(rd, tb);
-	link_print_phys_state(rd, tb);
+	link_print_subnet_prefix(tb);
+	link_print_lid(tb);
+	link_print_sm_lid(tb);
+	link_print_lmc(tb);
+	link_print_state(tb);
+	link_print_phys_state(tb);
 	link_print_netdev(rd, tb);
 	if (rd->show_details)
-		link_print_caps(rd, tb);
+		link_print_caps(tb);
+
+	close_json_object();
+	newline();
 
-	newline(rd);
 	return MNL_CB_OK;
 }
 
diff --git a/rdma/rdma.h b/rdma/rdma.h
index 65e3557d4036..1f8f83269457 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -135,9 +135,10 @@ int rd_attr_cb(const struct nlattr *attr, void *data);
  */
 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_raw_data(struct rd *rd, struct nlattr **nla_line);
+void newline_indent(void);
+void newline(void);
+
 #define MAX_LINE_LENGTH 80
 
+
 #endif /* _RDMA_TOOL_H_ */
diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c
index fb32c58a695a..8b6b349798f9 100644
--- a/rdma/res-cmid.c
+++ b/rdma/res-cmid.c
@@ -37,20 +37,17 @@ static const char *cm_id_ps_to_str(uint32_t ps)
 	}
 }
 
-static void print_cm_id_state(struct rd *rd, uint8_t state)
+static void print_cm_id_state(uint8_t state)
 {
-	print_string(PRINT_ANY, "state", "state %s ",
-			   cm_id_state_to_str(state));
+	print_string(PRINT_ANY, "state", "state %s ", cm_id_state_to_str(state));
 }
 
-static void print_ps(struct rd *rd, uint32_t ps)
+static void print_ps(uint32_t ps)
 {
-	print_string(PRINT_ANY, "ps", "ps %s ",
-			   cm_id_ps_to_str(ps));
+	print_string(PRINT_ANY, "ps", "ps %s ", cm_id_ps_to_str(ps));
 }
 
-static void print_ipaddr(struct rd *rd, const char *key, char *addrstr,
-			 uint16_t port)
+static void print_ipaddr(const char *key, char *addrstr, uint16_t port)
 {
 	int name_size = INET6_ADDRSTRLEN + strlen(":65535");
 	char json_name[name_size];
@@ -181,24 +178,24 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_link(rd, idx, name, port, nla_line);
-	res_print_u32(rd, "cm-idn", cm_idn,
-		       nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]);
-	res_print_u32(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+	print_link(idx, name, port, nla_line);
+	res_print_u32("cm-idn", cm_idn, nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]);
+	res_print_u32("lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
 	if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
-		print_qp_type(rd, type);
-	print_cm_id_state(rd, state);
-	print_ps(rd, ps);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+		print_qp_type(type);
+	print_cm_id_state(state);
+	print_ps(ps);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR])
-		print_ipaddr(rd, "src-addr", src_addr_str, src_port);
+		print_ipaddr("src-addr", src_addr_str, src_port);
 	if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
-		print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
+		print_ipaddr("dst-addr", dst_addr_str, dst_port);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
-	newline(rd);
+	close_json_object();
+	newline();
 
 out:
 	return MNL_CB_OK;
diff --git a/rdma/res-cq.c b/rdma/res-cq.c
index b4dcc026ed4b..420e935ac926 100644
--- a/rdma/res-cq.c
+++ b/rdma/res-cq.c
@@ -17,14 +17,14 @@ static const char *poll_ctx_to_str(uint8_t idx)
 	return "UNKNOWN";
 }
 
-static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr)
+static void print_poll_ctx(uint8_t poll_ctx, struct nlattr *attr)
 {
 	if (!attr)
 		return;
 	print_string(PRINT_ANY, "poll-ctx", "poll-ctx %s ", poll_ctx_to_str(poll_ctx));
 }
 
-static void print_cq_dim_setting(struct rd *rd, struct nlattr *attr)
+static void print_cq_dim_setting(struct nlattr *attr)
 {
 	uint8_t dim_setting;
 
@@ -45,9 +45,10 @@ static int res_cq_line_raw(struct rd *rd, const char *name, int idx,
 		return MNL_CB_ERROR;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
+	print_dev(idx, name);
 	print_raw_data(rd, nla_line);
-	newline(rd);
+	close_json_object();
+	newline();
 
 	return MNL_CB_OK;
 }
@@ -110,19 +111,19 @@ static int res_cq_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
-	res_print_u32(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
-	res_print_u32(rd, "cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]);
-	res_print_u64(rd, "users", users,
-		       nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
-	print_poll_ctx(rd, poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]);
-	print_cq_dim_setting(rd, nla_line[RDMA_NLDEV_ATTR_DEV_DIM]);
-	res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+	print_dev(idx, name);
+	res_print_u32("cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+	res_print_u32("cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]);
+	res_print_u64("users", users, nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
+	print_poll_ctx(poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]);
+	print_cq_dim_setting(nla_line[RDMA_NLDEV_ATTR_DEV_DIM]);
+	res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
-	newline(rd);
+	close_json_object();
+	newline();
 
 out:
 	return MNL_CB_OK;
diff --git a/rdma/res-ctx.c b/rdma/res-ctx.c
index 500186d9ff59..0a84d0169327 100644
--- a/rdma/res-ctx.c
+++ b/rdma/res-ctx.c
@@ -41,13 +41,14 @@ static int res_ctx_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
-	res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+	print_dev(idx, name);
+	res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
-	newline(rd);
+	close_json_object();
+	newline();
 
 out:
 	return MNL_CB_OK;
diff --git a/rdma/res-mr.c b/rdma/res-mr.c
index fb48d5df6cad..693d98c142b6 100644
--- a/rdma/res-mr.c
+++ b/rdma/res-mr.c
@@ -14,9 +14,10 @@ static int res_mr_line_raw(struct rd *rd, const char *name, int idx,
 		return MNL_CB_ERROR;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
+	print_dev(idx, name);
 	print_raw_data(rd, nla_line);
-	newline(rd);
+	close_json_object();
+	newline();
 
 	return MNL_CB_OK;
 }
@@ -75,19 +76,20 @@ static int res_mr_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
-	res_print_u32(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
-	print_key(rd, "rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]);
-	print_key(rd, "lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]);
-	print_key(rd, "iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]);
-	res_print_u64(rd, "mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]);
-	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+	print_dev(idx, name);
+	res_print_u32("mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
+	print_key("rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]);
+	print_key("lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]);
+	print_key("iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]);
+	res_print_u64("mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]);
+	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
 	print_raw_data(rd, nla_line);
-	newline(rd);
+	close_json_object();
+	newline();
 
 out:
 	return MNL_CB_OK;
diff --git a/rdma/res-pd.c b/rdma/res-pd.c
index 66f91f42860f..40a3f9bd561d 100644
--- a/rdma/res-pd.c
+++ b/rdma/res-pd.c
@@ -63,21 +63,20 @@ static int res_pd_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
-	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
-	print_key(rd, "local_dma_lkey", local_dma_lkey,
+	print_dev(idx, name);
+	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
+	print_key("local_dma_lkey", local_dma_lkey,
 		  nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]);
-	res_print_u64(rd, "users", users,
-		       nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
-	print_key(rd, "unsafe_global_rkey", unsafe_global_rkey,
+	res_print_u64("users", users, nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
+	print_key("unsafe_global_rkey", unsafe_global_rkey,
 		  nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]);
-	res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+	res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
-	newline(rd);
-
+	close_json_object();
+	newline();
 out:
 	return MNL_CB_OK;
 }
diff --git a/rdma/res-qp.c b/rdma/res-qp.c
index 2390c0b5732b..145292aa375f 100644
--- a/rdma/res-qp.c
+++ b/rdma/res-qp.c
@@ -28,24 +28,24 @@ static const char *qp_states_to_str(uint8_t idx)
 	return "UNKNOWN";
 }
 
-static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+static void print_rqpn(uint32_t val, struct nlattr **nla_line)
 {
 	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
 		return;
 	print_uint(PRINT_ANY, "rqpn", "rqpn %d ", val);
 }
 
-static void print_type(struct rd *rd, uint32_t val)
+static void print_type(uint32_t val)
 {
 	print_string(PRINT_ANY, "type", "type %s ", qp_types_to_str(val));
 }
 
-static void print_state(struct rd *rd, uint32_t val)
+static void print_state(uint32_t val)
 {
 	print_string(PRINT_ANY, "state", "state %s ", qp_states_to_str(val));
 }
 
-static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+static void print_rqpsn(uint32_t val, struct nlattr **nla_line)
 {
 	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
 		return;
@@ -53,7 +53,7 @@ static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
 	print_uint(PRINT_ANY, "rq-psn", "rq-psn %d ", val);
 }
 
-static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+static void print_pathmig(uint32_t val, struct nlattr **nla_line)
 {
 	if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
 		return;
@@ -68,9 +68,10 @@ static int res_qp_line_raw(struct rd *rd, const char *name, int idx,
 		return MNL_CB_ERROR;
 
 	open_json_object(NULL);
-	print_link(rd, idx, name, rd->port_idx, nla_line);
+	print_link(idx, name, rd->port_idx, nla_line);
 	print_raw_data(rd, nla_line);
-	newline(rd);
+	close_json_object();
+	newline();
 
 	return MNL_CB_OK;
 }
@@ -159,24 +160,24 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_link(rd, idx, name, port, nla_line);
-	res_print_u32(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
-	print_rqpn(rd, rqpn, nla_line);
+	print_link(idx, name, port, nla_line);
+	res_print_u32("lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+	print_rqpn(rqpn, nla_line);
 
-	print_type(rd, type);
-	print_state(rd, state);
+	print_type(type);
+	print_state(state);
 
-	print_rqpsn(rd, rq_psn, nla_line);
-	res_print_u32(rd, "sq-psn", sq_psn,
-		       nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
+	print_rqpsn(rq_psn, nla_line);
+	res_print_u32("sq-psn", sq_psn, nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
 
-	print_pathmig(rd, path_mig_state, nla_line);
-	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+	print_pathmig(path_mig_state, nla_line);
+	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
-	newline(rd);
+	close_json_object();
+	newline();
 out:
 	return MNL_CB_OK;
 }
diff --git a/rdma/res-srq.c b/rdma/res-srq.c
index e702fecd1f34..1d35900af7d1 100644
--- a/rdma/res-srq.c
+++ b/rdma/res-srq.c
@@ -20,7 +20,7 @@ static const char *srq_types_to_str(uint8_t idx)
 	return "UNKNOWN";
 }
 
-static void print_type(struct rd *rd, uint32_t val)
+static void print_type(uint32_t val)
 {
 	print_string(PRINT_ANY, "type", "type %s ", srq_types_to_str(val));
 }
@@ -168,9 +168,10 @@ static int res_srq_line_raw(struct rd *rd, const char *name, int idx,
 		return MNL_CB_ERROR;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
+	print_dev(idx, name);
 	print_raw_data(rd, nla_line);
-	newline(rd);
+	close_json_object();
+	newline();
 
 	return MNL_CB_OK;
 }
@@ -231,17 +232,18 @@ static int res_srq_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
-	res_print_u32(rd, "srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]);
-	print_type(rd, type);
+	print_dev(idx, name);
+	res_print_u32("srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]);
+	print_type(type);
 	print_qps(qp_str);
-	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
-	res_print_u32(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
-	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
+	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
+	res_print_u32("cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
 
 	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
-	newline(rd);
+	close_json_object();
+	newline();
 
 out:
 	return MNL_CB_OK;
diff --git a/rdma/res.c b/rdma/res.c
index f64224e1f3eb..3e024134d4fe 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -29,7 +29,7 @@ static int res_help(struct rd *rd)
 	return 0;
 }
 
-static int res_print_summary(struct rd *rd, struct nlattr **tb)
+static int res_print_summary(struct nlattr **tb)
 {
 	struct nlattr *nla_table = tb[RDMA_NLDEV_ATTR_RES_SUMMARY];
 	struct nlattr *nla_entry;
@@ -51,8 +51,7 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb)
 
 		name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]);
 		curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
-		res_print_u64(rd, name, curr,
-			      nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
+		res_print_u64(name, curr, nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
 	}
 	return 0;
 }
@@ -65,7 +64,6 @@ static int res_no_args_idx_parse_cb(const struct nlmsghdr *nlh, void *data)
 static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data)
 {
 	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
-	struct rd *rd = data;
 	const char *name;
 	uint32_t idx;
 
@@ -80,8 +78,10 @@ static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data)
 	open_json_object(NULL);
 	print_uint(PRINT_ANY, "ifindex", "%u: ", idx);
 	print_string(PRINT_ANY, "ifname", "%s: ", name);
-	res_print_summary(rd, tb);
-	newline(rd);
+	res_print_summary(tb);
+	close_json_object();
+	newline();
+
 	return MNL_CB_OK;
 }
 
@@ -153,7 +153,7 @@ const char *qp_types_to_str(uint8_t idx)
 	return (idx == 0xFF) ? "DRIVER" : "UNKNOWN";
 }
 
-void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line)
+void print_comm(const char *str, struct nlattr **nla_line)
 {
 	char tmp[18];
 
@@ -167,13 +167,13 @@ void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line)
 	print_string(PRINT_ANY, "comm", "comm %s ", tmp);
 }
 
-void print_dev(struct rd *rd, uint32_t idx, const char *name)
+void print_dev(uint32_t idx, const char *name)
 {
 	print_int(PRINT_ANY, "ifindex", NULL, idx);
 	print_string(PRINT_ANY, "ifname", "dev %s ", name);
 }
 
-void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
+void print_link(uint32_t idx, const char *name, uint32_t port,
 		struct nlattr **nla_line)
 {
 	char tmp[64] = {};
@@ -190,13 +190,12 @@ void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
 	print_string(PRINT_FP, NULL, "link %s ", tmp);
 }
 
-void print_qp_type(struct rd *rd, uint32_t val)
+void print_qp_type(uint32_t val)
 {
 	print_string(PRINT_ANY, "qp-type", "qp-type %s ", qp_types_to_str(val));
 }
 
-void print_key(struct rd *rd, const char *name, uint64_t val,
-	       struct nlattr *nlattr)
+void print_key(const char *name, uint64_t val, struct nlattr *nlattr)
 {
 	if (!nlattr)
 		return;
@@ -204,8 +203,7 @@ void print_key(struct rd *rd, const char *name, uint64_t val,
 	print_hex(PRINT_ANY, name, " 0x%" PRIx64 " ", val);
 }
 
-void res_print_u32(struct rd *rd, const char *name, uint32_t val,
-		    struct nlattr *nlattr)
+void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr)
 {
 	if (!nlattr)
 		return;
@@ -213,8 +211,7 @@ void res_print_u32(struct rd *rd, const char *name, uint32_t val,
 	print_uint(PRINT_FP, NULL, " %" PRIu32 " ", val);
 }
 
-void res_print_u64(struct rd *rd, const char *name, uint64_t val,
-		    struct nlattr *nlattr)
+void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr)
 {
 	if (!nlattr)
 		return;
diff --git a/rdma/res.h b/rdma/res.h
index e880c28be569..fd09ce7dc084 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -185,16 +185,12 @@ struct filters srq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
 RES_FUNC(res_srq, RDMA_NLDEV_CMD_RES_SRQ_GET, srq_valid_filters, true,
 	 RDMA_NLDEV_ATTR_RES_SRQN);
 
-void print_dev(struct rd *rd, uint32_t idx, const char *name);
-void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
-		struct nlattr **nla_line);
-void print_key(struct rd *rd, const char *name, uint64_t val,
-	       struct nlattr *nlattr);
-void res_print_u32(struct rd *rd, const char *name, uint32_t val,
-		    struct nlattr *nlattr);
-void res_print_u64(struct rd *rd, const char *name, uint64_t val,
-		    struct nlattr *nlattr);
-void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line);
+void print_dev(uint32_t idx, const char *name);
+void print_link(uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line);
+void print_key(const char *name, uint64_t val, struct nlattr *nlattr);
+void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr);
+void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr);
+void print_comm(const char *str, struct nlattr **nla_line);
 const char *qp_types_to_str(uint8_t idx);
-void print_qp_type(struct rd *rd, uint32_t val);
+void print_qp_type(uint32_t val);
 #endif /* _RDMA_TOOL_RES_H_ */
diff --git a/rdma/stat-mr.c b/rdma/stat-mr.c
index 2ba6cb07693e..8f9eb17f00b7 100644
--- a/rdma/stat-mr.c
+++ b/rdma/stat-mr.c
@@ -21,17 +21,17 @@ static int stat_mr_line(struct rd *rd, const char *name, int idx,
 		goto out;
 
 	open_json_object(NULL);
-	print_dev(rd, idx, name);
-	res_print_u32(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
+	print_dev(idx, name);
+	res_print_u32("mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
 
 	if (nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]) {
-		ret = res_get_hwcounters(
-			rd, nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
+		ret = res_get_hwcounters(nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
 		if (ret != MNL_CB_OK)
 			return ret;
 	}
 
-	newline(rd);
+	close_json_object();
+	print_nl();
 out:
 	return MNL_CB_OK;
 }
diff --git a/rdma/stat.c b/rdma/stat.c
index e90b6197ceb7..46ed17651790 100644
--- a/rdma/stat.c
+++ b/rdma/stat.c
@@ -62,8 +62,7 @@ static struct counter_param auto_params[] = {
 	{ NULL },
 };
 
-static int prepare_auto_mode_str(struct nlattr **tb, uint32_t mask,
-				 char *output, int len)
+static int prepare_auto_mode_str(uint32_t mask, char *output, int len)
 {
 	char s[] = "qp auto";
 	int i, outlen = strlen(s);
@@ -105,7 +104,6 @@ static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data)
 	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
 	uint32_t mode = 0, mask = 0;
 	char output[128] = {};
-	struct rd *rd = data;
 	uint32_t idx, port;
 	const char *name;
 
@@ -128,15 +126,17 @@ static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data)
 		if (!tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK])
 			return MNL_CB_ERROR;
 		mask = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]);
-		prepare_auto_mode_str(tb, mask, output, sizeof(output));
+		prepare_auto_mode_str(mask, output, sizeof(output));
 	} else {
 		snprintf(output, sizeof(output), "qp auto off");
 	}
 
 	open_json_object(NULL);
-	print_link(rd, idx, name, port, tb);
+	print_link(idx, name, port, tb);
 	print_string(PRINT_ANY, "mode", "mode %s ", output);
-	newline(rd);
+	close_json_object();
+	newline();
+
 	return MNL_CB_OK;
 }
 
@@ -184,7 +184,7 @@ static int stat_qp_get_mode(struct rd *rd)
 	return rd_exec_cmd(rd, cmds, "parameter");
 }
 
-int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
+int res_get_hwcounters(struct nlattr *hwc_table, bool print)
 {
 	struct nlattr *nla_entry;
 	const char *nm;
@@ -208,8 +208,8 @@ int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
 
 		nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
 		v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]);
-		newline_indent(rd);
-		res_print_u64(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
+		newline_indent();
+		res_print_u64(nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
 	}
 
 	return MNL_CB_OK;
@@ -278,17 +278,17 @@ static int res_counter_line(struct rd *rd, const char *name, int index,
 			return MNL_CB_OK;
 	}
 
-	err = res_get_hwcounters(rd, hwc_table, false);
+	err = res_get_hwcounters(hwc_table, false);
 	if (err != MNL_CB_OK)
 		return err;
 	open_json_object(NULL);
-	print_link(rd, index, name, port, nla_line);
+	print_link(index, name, port, nla_line);
 	print_uint(PRINT_ANY, "cntn", "cntn %u ", cntn);
 	if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
-		print_qp_type(rd, qp_type);
-	res_print_u64(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
-	print_comm(rd, comm, nla_line);
-	res_get_hwcounters(rd, hwc_table, true);
+		print_qp_type(qp_type);
+	res_print_u64("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(comm, nla_line);
+	res_get_hwcounters(hwc_table, true);
 	isfirst = true;
 	open_json_array(PRINT_JSON, "lqpn");
 	print_string(PRINT_FP, NULL, "%s    LQPN: <", _SL_);
@@ -308,7 +308,9 @@ static int res_counter_line(struct rd *rd, const char *name, int index,
 		isfirst = false;
 	}
 	close_json_array(PRINT_ANY, ">");
-	newline(rd);
+	close_json_object();
+	newline();
+
 	return MNL_CB_OK;
 }
 
@@ -757,7 +759,6 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
 	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
 	struct nlattr *nla_entry;
 	const char *dev, *name;
-	struct rd *rd = data;
 	int enabled, err = 0;
 	bool isfirst = true;
 	uint32_t port;
@@ -801,7 +802,7 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
 			} else {
 				print_string(PRINT_FP, NULL, ",", NULL);
 			}
-			newline_indent(rd);
+			newline_indent();
 
 			print_string(PRINT_ANY, NULL, "%s", name);
 		}
@@ -809,7 +810,8 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
 
 	if (!isfirst) {
 		close_json_array(PRINT_JSON, NULL);
-		newline(rd);
+		close_json_object();
+		newline();
 	}
 
 	return 0;
@@ -1052,7 +1054,6 @@ static int stat_unset(struct rd *rd)
 static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data)
 {
 	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
-	struct rd *rd = data;
 	const char *name;
 	uint32_t port;
 	int ret;
@@ -1068,9 +1069,10 @@ static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data)
 	open_json_object(NULL);
 	print_string(PRINT_ANY, "ifname", "link %s/", name);
 	print_uint(PRINT_ANY, "port", "%u ", port);
-	ret = res_get_hwcounters(rd, tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
+	ret = res_get_hwcounters(tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
 
-	newline(rd);
+	close_json_object();
+	newline();
 	return ret;
 }
 
diff --git a/rdma/stat.h b/rdma/stat.h
index b03a10c9eef6..5adcf4f37e20 100644
--- a/rdma/stat.h
+++ b/rdma/stat.h
@@ -9,9 +9,7 @@
 
 #include "rdma.h"
 
-int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table,
-		       bool print);
-
+int res_get_hwcounters(struct nlattr *hwc_table, bool print);
 int stat_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
 int stat_mr_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
 
diff --git a/rdma/utils.c b/rdma/utils.c
index aeb627be7715..27595a387faa 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -642,6 +642,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd))
 	}
 out:
 	delete_json_obj();
+
 	return ret;
 }
 
@@ -771,28 +772,29 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index)
 
 #define nla_type(attr) ((attr)->nla_type & NLA_TYPE_MASK)
 
-void newline(struct rd *rd)
+/* End of device object always print a newline */
+void newline(void)
 {
-	close_json_object();
-	print_nl();
+	putchar('\n');
+	fflush(stdout);
 }
 
-void newline_indent(struct rd *rd)
+/* End of partial multi-line segment of a device object */
+void newline_indent(void)
 {
-	newline(rd);
-	print_string(PRINT_FP, NULL, "    ", NULL);
+	if (!is_json_context())
+		printf("%s    ", _SL_);
 }
 
-static int print_driver_string(struct rd *rd, const char *key_str,
-				 const char *val_str)
+static int print_driver_string(const char *key_str, const char *val_str)
 {
 	print_string(PRINT_ANY, key_str, key_str, val_str);
 	print_string(PRINT_FP, NULL, " %s ", val_str);
 	return 0;
 }
 
-static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
-			      enum rdma_nldev_print_type print_type)
+static int print_driver_s32(const char *key_str, int32_t val,
+			    enum rdma_nldev_print_type print_type)
 {
 	if (!is_json_context()) {
 		switch (print_type) {
@@ -808,8 +810,8 @@ static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
 	return 0;
 }
 
-static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
-			      enum rdma_nldev_print_type print_type)
+static int print_driver_u32(const char *key_str, uint32_t val,
+			    enum rdma_nldev_print_type print_type)
 {
 	if (!is_json_context()) {
 		switch (print_type) {
@@ -825,8 +827,8 @@ static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
 	return 0;
 }
 
-static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
-			      enum rdma_nldev_print_type print_type)
+static int print_driver_s64(const char *key_str, int64_t val,
+			    enum rdma_nldev_print_type print_type)
 {
 	if (!is_json_context()) {
 		switch (print_type) {
@@ -842,8 +844,8 @@ static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
 	return 0;
 }
 
-static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val,
-			      enum rdma_nldev_print_type print_type)
+static int print_driver_u64(const char *key_str, uint64_t val,
+			    enum rdma_nldev_print_type print_type)
 {
 	if (!is_json_context()) {
 		switch (print_type) {
@@ -859,9 +861,8 @@ static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val,
 	return 0;
 }
 
-static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
-				struct nlattr *val_attr,
-				enum rdma_nldev_print_type print_type)
+static int print_driver_entry(struct nlattr *key_attr, struct nlattr *val_attr,
+			      enum rdma_nldev_print_type print_type)
 {
 	int attr_type = nla_type(val_attr);
 	int ret = -EINVAL;
@@ -872,19 +873,19 @@ static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
 
 	switch (attr_type) {
 	case RDMA_NLDEV_ATTR_DRIVER_STRING:
-		ret = print_driver_string(rd, key_str, mnl_attr_get_str(val_attr));
+		ret = print_driver_string(key_str, mnl_attr_get_str(val_attr));
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_S32:
-		ret = print_driver_s32(rd, key_str, mnl_attr_get_u32(val_attr), print_type);
+		ret = print_driver_s32(key_str, mnl_attr_get_u32(val_attr), print_type);
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_U32:
-		ret = print_driver_u32(rd, key_str, mnl_attr_get_u32(val_attr), print_type);
+		ret = print_driver_u32(key_str, mnl_attr_get_u32(val_attr), print_type);
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_S64:
-		ret = print_driver_s64(rd, key_str, mnl_attr_get_u64(val_attr), print_type);
+		ret = print_driver_s64(key_str, mnl_attr_get_u64(val_attr), print_type);
 		break;
 	case RDMA_NLDEV_ATTR_DRIVER_U64:
-		ret = print_driver_u64(rd, key_str, mnl_attr_get_u64(val_attr), print_type);
+		ret = print_driver_u64(key_str, mnl_attr_get_u64(val_attr), print_type);
 		break;
 	}
 	free(key_str);
@@ -920,7 +921,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
 	if (!rd->show_driver_details || !tb)
 		return;
 
-	newline_indent(rd);
+	newline_indent();
 
 	/*
 	 * Driver attrs are tuples of {key, [print-type], value}.
@@ -932,7 +933,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
 	mnl_attr_for_each_nested(tb_entry, tb) {
 
 		if (cc > MAX_LINE_LENGTH) {
-			newline_indent(rd);
+			newline_indent();
 			cc = 0;
 		}
 		if (rd_attr_check(tb_entry, &type) != MNL_CB_OK)
@@ -945,7 +946,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
 			print_type = mnl_attr_get_u8(tb_entry);
 		} else {
 			val = tb_entry;
-			ret = print_driver_entry(rd, key, val, print_type);
+			ret = print_driver_entry(key, val, print_type);
 			if (ret < 0)
 				return;
 			cc += ret;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 0/6] rdma: print related patches
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
                   ` (5 preceding siblings ...)
  2024-01-04  1:13 ` [PATCH v2 iproute2 6/6] rdma: do not mix newline and json object Stephen Hemminger
@ 2024-01-04  5:58 ` Chengchang Tang
  2024-01-07  8:20 ` Leon Romanovsky
  2024-01-07 17:30 ` patchwork-bot+netdevbpf
  8 siblings, 0 replies; 15+ messages in thread
From: Chengchang Tang @ 2024-01-04  5:58 UTC (permalink / raw)
  To: Stephen Hemminger, leon; +Cc: netdev



On 2024/1/4 9:13, Stephen Hemminger wrote:
> This set of patches makes rdma comman behave more like the
> other commands in iproute2 around printing flags.
> There are some other things found while looking at that code.
>
> This version keeps similar function names to original
>
> Stephen Hemminger (6):
>    rdma: shorten print_ lines
>    rdma: use standard flag for json
>    rdma: make pretty behave like other commands
>    rdma: make supress_errors a bit
>    rdma: add oneline flag
>    rdma: do not mix newline and json object
>
>

Both pretty and oneline are working well.

Tested-by: Chengchang Tang <tangchengchang@huawei.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 1/6] rdma: shorten print_ lines
  2024-01-04  1:13 ` [PATCH v2 iproute2 1/6] rdma: shorten print_ lines Stephen Hemminger
@ 2024-01-04 11:28   ` Petr Machata
  0 siblings, 0 replies; 15+ messages in thread
From: Petr Machata @ 2024-01-04 11:28 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: leon, netdev


Stephen Hemminger <stephen@networkplumber.org> writes:

> With the shorter form of print_ function some of the lines can
> now be shortened. Max line length in iproute2 should be 100 characters
> or less.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

Reviewed-by: Petr Machata <me@pmachata.org>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 2/6] rdma: use standard flag for json
  2024-01-04  1:13 ` [PATCH v2 iproute2 2/6] rdma: use standard flag for json Stephen Hemminger
@ 2024-01-04 12:07   ` Petr Machata
  0 siblings, 0 replies; 15+ messages in thread
From: Petr Machata @ 2024-01-04 12:07 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: leon, netdev


Stephen Hemminger <stephen@networkplumber.org> writes:

> The other iproute2 utils use variable json as flag.

Some do, some don't. dcb, devlink, rdma do not, the rest do.

Personally I'm not a fan of global state, and consider this patch to be
a step back in terms of best practices. I do realize this is how it's
done in iproute2. To the point that utils.h actually carries external
declarations for these variables. But to me those are inevitable warts,
not something to embrace and extend.

Objectively... whatever. There's only one instance of the context
structure anyway. It's just the overtones of a quick hack that irk me.

Anyway, the mechanical parts of the conversion look OK. But:

> diff --git a/rdma/stat.c b/rdma/stat.c
> index 28b1ad857219..6a3f8ca44892 100644
> --- a/rdma/stat.c
> +++ b/rdma/stat.c
> @@ -208,7 +208,7 @@ int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
>  
>  		nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
>  		v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]);
> -		if (rd->pretty_output && !rd->json_output)
> +		if (rd->pretty_output)
>  			newline_indent(rd);

newline_indent() issues close_json_object(). Previously it wouldn't be
invoked in JSON mode, now it will be. Doesn't this break JSON output?
Same question for the hunk below.

>  		res_print_u64(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
>  	}
> @@ -802,7 +802,7 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
>  			} else {
>  				print_string(PRINT_FP, NULL, ",", NULL);
>  			}
> -			if (rd->pretty_output && !rd->json_output)
> +			if (rd->pretty_output)
>  				newline_indent(rd);
>  
>  			print_string(PRINT_ANY, NULL, "%s", name);

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 4/6] rdma: make supress_errors a bit
  2024-01-04  1:13 ` [PATCH v2 iproute2 4/6] rdma: make supress_errors a bit Stephen Hemminger
@ 2024-01-04 14:17   ` Petr Machata
  0 siblings, 0 replies; 15+ messages in thread
From: Petr Machata @ 2024-01-04 14:17 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: leon, netdev


Stephen Hemminger <stephen@networkplumber.org> writes:

> Like other command line flags supress_errors can be a bit.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

Reviewed-by: Petr Machata <me@pmachata.org>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 5/6] rdma: add oneline flag
  2024-01-04  1:13 ` [PATCH v2 iproute2 5/6] rdma: add oneline flag Stephen Hemminger
@ 2024-01-04 14:20   ` Petr Machata
  0 siblings, 0 replies; 15+ messages in thread
From: Petr Machata @ 2024-01-04 14:20 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: leon, netdev


Stephen Hemminger <stephen@networkplumber.org> writes:

> diff --git a/rdma/rdma.c b/rdma/rdma.c
> index bee1985f96d8..131c6b2abd34 100644
> --- a/rdma/rdma.c
> +++ b/rdma/rdma.c
> @@ -16,7 +16,7 @@ static void help(char *name)
>  	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
>  	       "       %s [ -f[orce] ] -b[atch] filename\n"
>  	       "where  OBJECT := { dev | link | resource | system | statistic | help }\n"
> -	       "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\n", name, name);
> +	       "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] | -r[aw]}\n", name, name);
>  }

I think you indended to include -oneline above?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 6/6] rdma: do not mix newline and json object
  2024-01-04  1:13 ` [PATCH v2 iproute2 6/6] rdma: do not mix newline and json object Stephen Hemminger
@ 2024-01-04 14:29   ` Petr Machata
  0 siblings, 0 replies; 15+ messages in thread
From: Petr Machata @ 2024-01-04 14:29 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: leon, netdev


Stephen Hemminger <stephen@networkplumber.org> writes:

> Mixing the semantics of ending lines with the json object
> leads to several bugs where json object is closed twice, etc.
> Replace by breaking the meaning of newline() function into
> two parts.
>
> Now, lots of functions were taking the rdma data structure as
> argument but never using it.

Oh, I see, this is where the newline_indent() issue I pointed out in 2/6
is resolved. The two patches should be swapped, first print_nl() should
stop closing JSON, then we can safely invoke it in non-JSON context.

Also, this would be much clearer as two patches, each for one paragraph
of the commit message.

> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  rdma/dev.c      | 34 ++++++++++++++++--------------
>  rdma/link.c     | 34 ++++++++++++++++--------------
>  rdma/rdma.h     |  7 ++++---
>  rdma/res-cmid.c | 37 +++++++++++++++------------------
>  rdma/res-cq.c   | 31 ++++++++++++++--------------
>  rdma/res-ctx.c  | 11 +++++-----
>  rdma/res-mr.c   | 26 ++++++++++++-----------
>  rdma/res-pd.c   | 21 +++++++++----------
>  rdma/res-qp.c   | 41 ++++++++++++++++++------------------
>  rdma/res-srq.c  | 24 +++++++++++----------
>  rdma/res.c      | 29 ++++++++++++--------------
>  rdma/res.h      | 18 +++++++---------
>  rdma/stat-mr.c  | 10 ++++-----
>  rdma/stat.c     | 46 +++++++++++++++++++++--------------------
>  rdma/stat.h     |  4 +---
>  rdma/utils.c    | 55 +++++++++++++++++++++++++------------------------
>  16 files changed, 216 insertions(+), 212 deletions(-)
>
> diff --git a/rdma/dev.c b/rdma/dev.c
> index 31868c6fe43e..f495b7138b34 100644
> --- a/rdma/dev.c
> +++ b/rdma/dev.c
> @@ -84,7 +84,7 @@ static const char *dev_caps_to_str(uint32_t idx)
>  	return "UNKNOWN";
>  }
>  
> -static void dev_print_caps(struct rd *rd, struct nlattr **tb)
> +static void dev_print_caps(struct nlattr **tb)
>  {
>  	uint64_t caps;
>  	uint32_t idx;
> @@ -106,9 +106,10 @@ static void dev_print_caps(struct rd *rd, struct nlattr **tb)
>  	close_json_array(PRINT_ANY, ">");
>  }
>  
> -static void dev_print_fw(struct rd *rd, struct nlattr **tb)
> +static void dev_print_fw(struct nlattr **tb)
>  {
>  	const char *str;
> +
>  	if (!tb[RDMA_NLDEV_ATTR_FW_VERSION])
>  		return;
>  
> @@ -116,7 +117,7 @@ static void dev_print_fw(struct rd *rd, struct nlattr **tb)
>  	print_string(PRINT_ANY, "fw", "fw %s ", str);
>  }
>  
> -static void dev_print_node_guid(struct rd *rd, struct nlattr **tb)
> +static void dev_print_node_guid(struct nlattr **tb)
>  {
>  	uint64_t node_guid;
>  	uint16_t vp[4];
> @@ -132,7 +133,7 @@ static void dev_print_node_guid(struct rd *rd, struct nlattr **tb)
>  			   str);
>  }
>  
> -static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
> +static void dev_print_sys_image_guid(struct nlattr **tb)
>  {
>  	uint64_t sys_image_guid;
>  	uint16_t vp[4];
> @@ -147,7 +148,7 @@ static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
>  	print_string(PRINT_ANY, "sys_image_guid", "sys_image_guid %s ", str);
>  }
>  
> -static void dev_print_dim_setting(struct rd *rd, struct nlattr **tb)
> +static void dev_print_dim_setting(struct nlattr **tb)
>  {
>  	uint8_t dim_setting;
>  
> @@ -174,7 +175,7 @@ static const char *node_type_to_str(uint8_t node_type)
>  	return "unknown";
>  }
>  
> -static void dev_print_node_type(struct rd *rd, struct nlattr **tb)
> +static void dev_print_node_type(struct nlattr **tb)
>  {
>  	const char *node_str;
>  	uint8_t node_type;
> @@ -187,7 +188,7 @@ static void dev_print_node_type(struct rd *rd, struct nlattr **tb)
>  	print_string(PRINT_ANY, "node_type", "node_type %s ", node_str);
>  }
>  
> -static void dev_print_dev_proto(struct rd *rd, struct nlattr **tb)
> +static void dev_print_dev_proto(struct nlattr **tb)
>  {
>  	const char *str;
>  
> @@ -208,23 +209,26 @@ static int dev_parse_cb(const struct nlmsghdr *nlh, void *data)
>  	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
>  	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
>  		return MNL_CB_ERROR;
> +
>  	open_json_object(NULL);
>  	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
>  	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
>  	print_uint(PRINT_ANY, "ifindex", "%u: ", idx);
>  	print_string(PRINT_ANY, "ifname", "%s: ", name);
>  
> -	dev_print_node_type(rd, tb);
> -	dev_print_dev_proto(rd, tb);
> -	dev_print_fw(rd, tb);
> -	dev_print_node_guid(rd, tb);
> -	dev_print_sys_image_guid(rd, tb);
> +	dev_print_node_type(tb);
> +	dev_print_dev_proto(tb);
> +	dev_print_fw(tb);
> +	dev_print_node_guid(tb);
> +	dev_print_sys_image_guid(tb);
>  	if (rd->show_details) {
> -		dev_print_dim_setting(rd, tb);
> -		dev_print_caps(rd, tb);
> +		dev_print_dim_setting(tb);
> +		dev_print_caps(tb);
>  	}
>  
> -	newline(rd);
> +	close_json_object();
> +	newline();
> +
>  	return MNL_CB_OK;
>  }
>  
> diff --git a/rdma/link.c b/rdma/link.c
> index d7d9558b49f2..853181733f00 100644
> --- a/rdma/link.c
> +++ b/rdma/link.c
> @@ -86,7 +86,7 @@ static const char *caps_to_str(uint32_t idx)
>  	return "UNKNOWN";
>  }
>  
> -static void link_print_caps(struct rd *rd, struct nlattr **tb)
> +static void link_print_caps(struct nlattr **tb)
>  {
>  	uint64_t caps;
>  	uint32_t idx;
> @@ -108,7 +108,7 @@ static void link_print_caps(struct rd *rd, struct nlattr **tb)
>  	close_json_array(PRINT_ANY, ">");
>  }
>  
> -static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb)
> +static void link_print_subnet_prefix(struct nlattr **tb)
>  {
>  	uint64_t subnet_prefix;
>  	uint16_t vp[4];
> @@ -123,7 +123,7 @@ static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb)
>  	print_string(PRINT_ANY, "subnet_prefix", "subnet_prefix %s ", str);
>  }
>  
> -static void link_print_lid(struct rd *rd, struct nlattr **tb)
> +static void link_print_lid(struct nlattr **tb)
>  {
>  	uint32_t lid;
>  
> @@ -134,7 +134,7 @@ static void link_print_lid(struct rd *rd, struct nlattr **tb)
>  	print_uint(PRINT_ANY, "lid", "lid %u ", lid);
>  }
>  
> -static void link_print_sm_lid(struct rd *rd, struct nlattr **tb)
> +static void link_print_sm_lid(struct nlattr **tb)
>  {
>  	uint32_t sm_lid;
>  
> @@ -145,7 +145,7 @@ static void link_print_sm_lid(struct rd *rd, struct nlattr **tb)
>  	print_uint(PRINT_ANY, "sm_lid", "sm_lid %u ", sm_lid);
>  }
>  
> -static void link_print_lmc(struct rd *rd, struct nlattr **tb)
> +static void link_print_lmc(struct nlattr **tb)
>  {
>  	uint8_t lmc;
>  
> @@ -167,7 +167,7 @@ static const char *link_state_to_str(uint8_t link_state)
>  	return "UNKNOWN";
>  }
>  
> -static void link_print_state(struct rd *rd, struct nlattr **tb)
> +static void link_print_state(struct nlattr **tb)
>  {
>  	uint8_t state;
>  
> @@ -192,7 +192,7 @@ static const char *phys_state_to_str(uint8_t phys_state)
>  	return "UNKNOWN";
>  };
>  
> -static void link_print_phys_state(struct rd *rd, struct nlattr **tb)
> +static void link_print_phys_state(struct nlattr **tb)
>  {
>  	uint8_t phys_state;
>  
> @@ -204,7 +204,7 @@ static void link_print_phys_state(struct rd *rd, struct nlattr **tb)
>  		     phys_state_to_str(phys_state));
>  }
>  
> -static void link_print_netdev(struct rd *rd, struct nlattr **tb)
> +static void link_print_netdev(const struct rd * rd, struct nlattr **tb)
>  {
>  	const char *netdev_name;
>  	uint32_t idx;
> @@ -242,17 +242,19 @@ static int link_parse_cb(const struct nlmsghdr *nlh, void *data)
>  	print_uint(PRINT_JSON, "ifindex", NULL, idx);
>  	print_string(PRINT_ANY, "ifname", "link %s/", name);
>  	print_uint(PRINT_ANY, "port", "%u ", port);
> -	link_print_subnet_prefix(rd, tb);
> -	link_print_lid(rd, tb);
> -	link_print_sm_lid(rd, tb);
> -	link_print_lmc(rd, tb);
> -	link_print_state(rd, tb);
> -	link_print_phys_state(rd, tb);
> +	link_print_subnet_prefix(tb);
> +	link_print_lid(tb);
> +	link_print_sm_lid(tb);
> +	link_print_lmc(tb);
> +	link_print_state(tb);
> +	link_print_phys_state(tb);
>  	link_print_netdev(rd, tb);
>  	if (rd->show_details)
> -		link_print_caps(rd, tb);
> +		link_print_caps(tb);
> +
> +	close_json_object();
> +	newline();
>  
> -	newline(rd);
>  	return MNL_CB_OK;
>  }
>  
> diff --git a/rdma/rdma.h b/rdma/rdma.h
> index 65e3557d4036..1f8f83269457 100644
> --- a/rdma/rdma.h
> +++ b/rdma/rdma.h
> @@ -135,9 +135,10 @@ int rd_attr_cb(const struct nlattr *attr, void *data);
>   */
>  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_raw_data(struct rd *rd, struct nlattr **nla_line);
> +void newline_indent(void);
> +void newline(void);
> +
>  #define MAX_LINE_LENGTH 80
>  
> +
>  #endif /* _RDMA_TOOL_H_ */
> diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c
> index fb32c58a695a..8b6b349798f9 100644
> --- a/rdma/res-cmid.c
> +++ b/rdma/res-cmid.c
> @@ -37,20 +37,17 @@ static const char *cm_id_ps_to_str(uint32_t ps)
>  	}
>  }
>  
> -static void print_cm_id_state(struct rd *rd, uint8_t state)
> +static void print_cm_id_state(uint8_t state)
>  {
> -	print_string(PRINT_ANY, "state", "state %s ",
> -			   cm_id_state_to_str(state));
> +	print_string(PRINT_ANY, "state", "state %s ", cm_id_state_to_str(state));
>  }
>  
> -static void print_ps(struct rd *rd, uint32_t ps)
> +static void print_ps(uint32_t ps)
>  {
> -	print_string(PRINT_ANY, "ps", "ps %s ",
> -			   cm_id_ps_to_str(ps));
> +	print_string(PRINT_ANY, "ps", "ps %s ", cm_id_ps_to_str(ps));
>  }
>  
> -static void print_ipaddr(struct rd *rd, const char *key, char *addrstr,
> -			 uint16_t port)
> +static void print_ipaddr(const char *key, char *addrstr, uint16_t port)
>  {
>  	int name_size = INET6_ADDRSTRLEN + strlen(":65535");
>  	char json_name[name_size];
> @@ -181,24 +178,24 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_link(rd, idx, name, port, nla_line);
> -	res_print_u32(rd, "cm-idn", cm_idn,
> -		       nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]);
> -	res_print_u32(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
> +	print_link(idx, name, port, nla_line);
> +	res_print_u32("cm-idn", cm_idn, nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]);
> +	res_print_u32("lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
>  	if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
> -		print_qp_type(rd, type);
> -	print_cm_id_state(rd, state);
> -	print_ps(rd, ps);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +		print_qp_type(type);
> +	print_cm_id_state(state);
> +	print_ps(ps);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR])
> -		print_ipaddr(rd, "src-addr", src_addr_str, src_port);
> +		print_ipaddr("src-addr", src_addr_str, src_port);
>  	if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
> -		print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
> +		print_ipaddr("dst-addr", dst_addr_str, dst_port);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  out:
>  	return MNL_CB_OK;
> diff --git a/rdma/res-cq.c b/rdma/res-cq.c
> index b4dcc026ed4b..420e935ac926 100644
> --- a/rdma/res-cq.c
> +++ b/rdma/res-cq.c
> @@ -17,14 +17,14 @@ static const char *poll_ctx_to_str(uint8_t idx)
>  	return "UNKNOWN";
>  }
>  
> -static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr)
> +static void print_poll_ctx(uint8_t poll_ctx, struct nlattr *attr)
>  {
>  	if (!attr)
>  		return;
>  	print_string(PRINT_ANY, "poll-ctx", "poll-ctx %s ", poll_ctx_to_str(poll_ctx));
>  }
>  
> -static void print_cq_dim_setting(struct rd *rd, struct nlattr *attr)
> +static void print_cq_dim_setting(struct nlattr *attr)
>  {
>  	uint8_t dim_setting;
>  
> @@ -45,9 +45,10 @@ static int res_cq_line_raw(struct rd *rd, const char *name, int idx,
>  		return MNL_CB_ERROR;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> +	print_dev(idx, name);
>  	print_raw_data(rd, nla_line);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  	return MNL_CB_OK;
>  }
> @@ -110,19 +111,19 @@ static int res_cq_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> -	res_print_u32(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
> -	res_print_u32(rd, "cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]);
> -	res_print_u64(rd, "users", users,
> -		       nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
> -	print_poll_ctx(rd, poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]);
> -	print_cq_dim_setting(rd, nla_line[RDMA_NLDEV_ATTR_DEV_DIM]);
> -	res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +	print_dev(idx, name);
> +	res_print_u32("cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
> +	res_print_u32("cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]);
> +	res_print_u64("users", users, nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
> +	print_poll_ctx(poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]);
> +	print_cq_dim_setting(nla_line[RDMA_NLDEV_ATTR_DEV_DIM]);
> +	res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  out:
>  	return MNL_CB_OK;
> diff --git a/rdma/res-ctx.c b/rdma/res-ctx.c
> index 500186d9ff59..0a84d0169327 100644
> --- a/rdma/res-ctx.c
> +++ b/rdma/res-ctx.c
> @@ -41,13 +41,14 @@ static int res_ctx_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> -	res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +	print_dev(idx, name);
> +	res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  out:
>  	return MNL_CB_OK;
> diff --git a/rdma/res-mr.c b/rdma/res-mr.c
> index fb48d5df6cad..693d98c142b6 100644
> --- a/rdma/res-mr.c
> +++ b/rdma/res-mr.c
> @@ -14,9 +14,10 @@ static int res_mr_line_raw(struct rd *rd, const char *name, int idx,
>  		return MNL_CB_ERROR;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> +	print_dev(idx, name);
>  	print_raw_data(rd, nla_line);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  	return MNL_CB_OK;
>  }
> @@ -75,19 +76,20 @@ static int res_mr_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> -	res_print_u32(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
> -	print_key(rd, "rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]);
> -	print_key(rd, "lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]);
> -	print_key(rd, "iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]);
> -	res_print_u64(rd, "mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]);
> -	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +	print_dev(idx, name);
> +	res_print_u32("mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
> +	print_key("rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]);
> +	print_key("lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]);
> +	print_key("iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]);
> +	res_print_u64("mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]);
> +	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
>  	print_raw_data(rd, nla_line);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  out:
>  	return MNL_CB_OK;
> diff --git a/rdma/res-pd.c b/rdma/res-pd.c
> index 66f91f42860f..40a3f9bd561d 100644
> --- a/rdma/res-pd.c
> +++ b/rdma/res-pd.c
> @@ -63,21 +63,20 @@ static int res_pd_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> -	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> -	print_key(rd, "local_dma_lkey", local_dma_lkey,
> +	print_dev(idx, name);
> +	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> +	print_key("local_dma_lkey", local_dma_lkey,
>  		  nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]);
> -	res_print_u64(rd, "users", users,
> -		       nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
> -	print_key(rd, "unsafe_global_rkey", unsafe_global_rkey,
> +	res_print_u64("users", users, nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
> +	print_key("unsafe_global_rkey", unsafe_global_rkey,
>  		  nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]);
> -	res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +	res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
> -	newline(rd);
> -
> +	close_json_object();
> +	newline();
>  out:
>  	return MNL_CB_OK;
>  }
> diff --git a/rdma/res-qp.c b/rdma/res-qp.c
> index 2390c0b5732b..145292aa375f 100644
> --- a/rdma/res-qp.c
> +++ b/rdma/res-qp.c
> @@ -28,24 +28,24 @@ static const char *qp_states_to_str(uint8_t idx)
>  	return "UNKNOWN";
>  }
>  
> -static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
> +static void print_rqpn(uint32_t val, struct nlattr **nla_line)
>  {
>  	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
>  		return;
>  	print_uint(PRINT_ANY, "rqpn", "rqpn %d ", val);
>  }
>  
> -static void print_type(struct rd *rd, uint32_t val)
> +static void print_type(uint32_t val)
>  {
>  	print_string(PRINT_ANY, "type", "type %s ", qp_types_to_str(val));
>  }
>  
> -static void print_state(struct rd *rd, uint32_t val)
> +static void print_state(uint32_t val)
>  {
>  	print_string(PRINT_ANY, "state", "state %s ", qp_states_to_str(val));
>  }
>  
> -static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
> +static void print_rqpsn(uint32_t val, struct nlattr **nla_line)
>  {
>  	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
>  		return;
> @@ -53,7 +53,7 @@ static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
>  	print_uint(PRINT_ANY, "rq-psn", "rq-psn %d ", val);
>  }
>  
> -static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line)
> +static void print_pathmig(uint32_t val, struct nlattr **nla_line)
>  {
>  	if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
>  		return;
> @@ -68,9 +68,10 @@ static int res_qp_line_raw(struct rd *rd, const char *name, int idx,
>  		return MNL_CB_ERROR;
>  
>  	open_json_object(NULL);
> -	print_link(rd, idx, name, rd->port_idx, nla_line);
> +	print_link(idx, name, rd->port_idx, nla_line);
>  	print_raw_data(rd, nla_line);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  	return MNL_CB_OK;
>  }
> @@ -159,24 +160,24 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_link(rd, idx, name, port, nla_line);
> -	res_print_u32(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
> -	print_rqpn(rd, rqpn, nla_line);
> +	print_link(idx, name, port, nla_line);
> +	res_print_u32("lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
> +	print_rqpn(rqpn, nla_line);
>  
> -	print_type(rd, type);
> -	print_state(rd, state);
> +	print_type(type);
> +	print_state(state);
>  
> -	print_rqpsn(rd, rq_psn, nla_line);
> -	res_print_u32(rd, "sq-psn", sq_psn,
> -		       nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
> +	print_rqpsn(rq_psn, nla_line);
> +	res_print_u32("sq-psn", sq_psn, nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
>  
> -	print_pathmig(rd, path_mig_state, nla_line);
> -	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +	print_pathmig(path_mig_state, nla_line);
> +	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  out:
>  	return MNL_CB_OK;
>  }
> diff --git a/rdma/res-srq.c b/rdma/res-srq.c
> index e702fecd1f34..1d35900af7d1 100644
> --- a/rdma/res-srq.c
> +++ b/rdma/res-srq.c
> @@ -20,7 +20,7 @@ static const char *srq_types_to_str(uint8_t idx)
>  	return "UNKNOWN";
>  }
>  
> -static void print_type(struct rd *rd, uint32_t val)
> +static void print_type(uint32_t val)
>  {
>  	print_string(PRINT_ANY, "type", "type %s ", srq_types_to_str(val));
>  }
> @@ -168,9 +168,10 @@ static int res_srq_line_raw(struct rd *rd, const char *name, int idx,
>  		return MNL_CB_ERROR;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> +	print_dev(idx, name);
>  	print_raw_data(rd, nla_line);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  	return MNL_CB_OK;
>  }
> @@ -231,17 +232,18 @@ static int res_srq_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> -	res_print_u32(rd, "srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]);
> -	print_type(rd, type);
> +	print_dev(idx, name);
> +	res_print_u32("srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]);
> +	print_type(type);
>  	print_qps(qp_str);
> -	res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> -	res_print_u32(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
> -	res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> +	res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
> +	res_print_u32("cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
> +	res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
>  
>  	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  
>  out:
>  	return MNL_CB_OK;
> diff --git a/rdma/res.c b/rdma/res.c
> index f64224e1f3eb..3e024134d4fe 100644
> --- a/rdma/res.c
> +++ b/rdma/res.c
> @@ -29,7 +29,7 @@ static int res_help(struct rd *rd)
>  	return 0;
>  }
>  
> -static int res_print_summary(struct rd *rd, struct nlattr **tb)
> +static int res_print_summary(struct nlattr **tb)
>  {
>  	struct nlattr *nla_table = tb[RDMA_NLDEV_ATTR_RES_SUMMARY];
>  	struct nlattr *nla_entry;
> @@ -51,8 +51,7 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb)
>  
>  		name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]);
>  		curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
> -		res_print_u64(rd, name, curr,
> -			      nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
> +		res_print_u64(name, curr, nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
>  	}
>  	return 0;
>  }
> @@ -65,7 +64,6 @@ static int res_no_args_idx_parse_cb(const struct nlmsghdr *nlh, void *data)
>  static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data)
>  {
>  	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
> -	struct rd *rd = data;
>  	const char *name;
>  	uint32_t idx;
>  
> @@ -80,8 +78,10 @@ static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data)
>  	open_json_object(NULL);
>  	print_uint(PRINT_ANY, "ifindex", "%u: ", idx);
>  	print_string(PRINT_ANY, "ifname", "%s: ", name);
> -	res_print_summary(rd, tb);
> -	newline(rd);
> +	res_print_summary(tb);
> +	close_json_object();
> +	newline();
> +
>  	return MNL_CB_OK;
>  }
>  
> @@ -153,7 +153,7 @@ const char *qp_types_to_str(uint8_t idx)
>  	return (idx == 0xFF) ? "DRIVER" : "UNKNOWN";
>  }
>  
> -void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line)
> +void print_comm(const char *str, struct nlattr **nla_line)
>  {
>  	char tmp[18];
>  
> @@ -167,13 +167,13 @@ void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line)
>  	print_string(PRINT_ANY, "comm", "comm %s ", tmp);
>  }
>  
> -void print_dev(struct rd *rd, uint32_t idx, const char *name)
> +void print_dev(uint32_t idx, const char *name)
>  {
>  	print_int(PRINT_ANY, "ifindex", NULL, idx);
>  	print_string(PRINT_ANY, "ifname", "dev %s ", name);
>  }
>  
> -void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
> +void print_link(uint32_t idx, const char *name, uint32_t port,
>  		struct nlattr **nla_line)
>  {
>  	char tmp[64] = {};
> @@ -190,13 +190,12 @@ void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
>  	print_string(PRINT_FP, NULL, "link %s ", tmp);
>  }
>  
> -void print_qp_type(struct rd *rd, uint32_t val)
> +void print_qp_type(uint32_t val)
>  {
>  	print_string(PRINT_ANY, "qp-type", "qp-type %s ", qp_types_to_str(val));
>  }
>  
> -void print_key(struct rd *rd, const char *name, uint64_t val,
> -	       struct nlattr *nlattr)
> +void print_key(const char *name, uint64_t val, struct nlattr *nlattr)
>  {
>  	if (!nlattr)
>  		return;
> @@ -204,8 +203,7 @@ void print_key(struct rd *rd, const char *name, uint64_t val,
>  	print_hex(PRINT_ANY, name, " 0x%" PRIx64 " ", val);
>  }
>  
> -void res_print_u32(struct rd *rd, const char *name, uint32_t val,
> -		    struct nlattr *nlattr)
> +void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr)
>  {
>  	if (!nlattr)
>  		return;
> @@ -213,8 +211,7 @@ void res_print_u32(struct rd *rd, const char *name, uint32_t val,
>  	print_uint(PRINT_FP, NULL, " %" PRIu32 " ", val);
>  }
>  
> -void res_print_u64(struct rd *rd, const char *name, uint64_t val,
> -		    struct nlattr *nlattr)
> +void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr)
>  {
>  	if (!nlattr)
>  		return;
> diff --git a/rdma/res.h b/rdma/res.h
> index e880c28be569..fd09ce7dc084 100644
> --- a/rdma/res.h
> +++ b/rdma/res.h
> @@ -185,16 +185,12 @@ struct filters srq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
>  RES_FUNC(res_srq, RDMA_NLDEV_CMD_RES_SRQ_GET, srq_valid_filters, true,
>  	 RDMA_NLDEV_ATTR_RES_SRQN);
>  
> -void print_dev(struct rd *rd, uint32_t idx, const char *name);
> -void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
> -		struct nlattr **nla_line);
> -void print_key(struct rd *rd, const char *name, uint64_t val,
> -	       struct nlattr *nlattr);
> -void res_print_u32(struct rd *rd, const char *name, uint32_t val,
> -		    struct nlattr *nlattr);
> -void res_print_u64(struct rd *rd, const char *name, uint64_t val,
> -		    struct nlattr *nlattr);
> -void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line);
> +void print_dev(uint32_t idx, const char *name);
> +void print_link(uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line);
> +void print_key(const char *name, uint64_t val, struct nlattr *nlattr);
> +void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr);
> +void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr);
> +void print_comm(const char *str, struct nlattr **nla_line);
>  const char *qp_types_to_str(uint8_t idx);
> -void print_qp_type(struct rd *rd, uint32_t val);
> +void print_qp_type(uint32_t val);
>  #endif /* _RDMA_TOOL_RES_H_ */
> diff --git a/rdma/stat-mr.c b/rdma/stat-mr.c
> index 2ba6cb07693e..8f9eb17f00b7 100644
> --- a/rdma/stat-mr.c
> +++ b/rdma/stat-mr.c
> @@ -21,17 +21,17 @@ static int stat_mr_line(struct rd *rd, const char *name, int idx,
>  		goto out;
>  
>  	open_json_object(NULL);
> -	print_dev(rd, idx, name);
> -	res_print_u32(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
> +	print_dev(idx, name);
> +	res_print_u32("mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
>  
>  	if (nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]) {
> -		ret = res_get_hwcounters(
> -			rd, nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
> +		ret = res_get_hwcounters(nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
>  		if (ret != MNL_CB_OK)
>  			return ret;
>  	}
>  
> -	newline(rd);
> +	close_json_object();
> +	print_nl();
>  out:
>  	return MNL_CB_OK;
>  }
> diff --git a/rdma/stat.c b/rdma/stat.c
> index e90b6197ceb7..46ed17651790 100644
> --- a/rdma/stat.c
> +++ b/rdma/stat.c
> @@ -62,8 +62,7 @@ static struct counter_param auto_params[] = {
>  	{ NULL },
>  };
>  
> -static int prepare_auto_mode_str(struct nlattr **tb, uint32_t mask,
> -				 char *output, int len)
> +static int prepare_auto_mode_str(uint32_t mask, char *output, int len)
>  {
>  	char s[] = "qp auto";
>  	int i, outlen = strlen(s);
> @@ -105,7 +104,6 @@ static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data)
>  	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
>  	uint32_t mode = 0, mask = 0;
>  	char output[128] = {};
> -	struct rd *rd = data;
>  	uint32_t idx, port;
>  	const char *name;
>  
> @@ -128,15 +126,17 @@ static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data)
>  		if (!tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK])
>  			return MNL_CB_ERROR;
>  		mask = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]);
> -		prepare_auto_mode_str(tb, mask, output, sizeof(output));
> +		prepare_auto_mode_str(mask, output, sizeof(output));
>  	} else {
>  		snprintf(output, sizeof(output), "qp auto off");
>  	}
>  
>  	open_json_object(NULL);
> -	print_link(rd, idx, name, port, tb);
> +	print_link(idx, name, port, tb);
>  	print_string(PRINT_ANY, "mode", "mode %s ", output);
> -	newline(rd);
> +	close_json_object();
> +	newline();
> +
>  	return MNL_CB_OK;
>  }
>  
> @@ -184,7 +184,7 @@ static int stat_qp_get_mode(struct rd *rd)
>  	return rd_exec_cmd(rd, cmds, "parameter");
>  }
>  
> -int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
> +int res_get_hwcounters(struct nlattr *hwc_table, bool print)
>  {
>  	struct nlattr *nla_entry;
>  	const char *nm;
> @@ -208,8 +208,8 @@ int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print)
>  
>  		nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
>  		v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]);
> -		newline_indent(rd);
> -		res_print_u64(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
> +		newline_indent();
> +		res_print_u64(nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]);
>  	}
>  
>  	return MNL_CB_OK;
> @@ -278,17 +278,17 @@ static int res_counter_line(struct rd *rd, const char *name, int index,
>  			return MNL_CB_OK;
>  	}
>  
> -	err = res_get_hwcounters(rd, hwc_table, false);
> +	err = res_get_hwcounters(hwc_table, false);
>  	if (err != MNL_CB_OK)
>  		return err;
>  	open_json_object(NULL);
> -	print_link(rd, index, name, port, nla_line);
> +	print_link(index, name, port, nla_line);
>  	print_uint(PRINT_ANY, "cntn", "cntn %u ", cntn);
>  	if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
> -		print_qp_type(rd, qp_type);
> -	res_print_u64(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> -	print_comm(rd, comm, nla_line);
> -	res_get_hwcounters(rd, hwc_table, true);
> +		print_qp_type(qp_type);
> +	res_print_u64("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +	print_comm(comm, nla_line);
> +	res_get_hwcounters(hwc_table, true);
>  	isfirst = true;
>  	open_json_array(PRINT_JSON, "lqpn");
>  	print_string(PRINT_FP, NULL, "%s    LQPN: <", _SL_);
> @@ -308,7 +308,9 @@ static int res_counter_line(struct rd *rd, const char *name, int index,
>  		isfirst = false;
>  	}
>  	close_json_array(PRINT_ANY, ">");
> -	newline(rd);
> +	close_json_object();
> +	newline();
> +
>  	return MNL_CB_OK;
>  }
>  
> @@ -757,7 +759,6 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
>  	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
>  	struct nlattr *nla_entry;
>  	const char *dev, *name;
> -	struct rd *rd = data;
>  	int enabled, err = 0;
>  	bool isfirst = true;
>  	uint32_t port;
> @@ -801,7 +802,7 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
>  			} else {
>  				print_string(PRINT_FP, NULL, ",", NULL);
>  			}
> -			newline_indent(rd);
> +			newline_indent();
>  
>  			print_string(PRINT_ANY, NULL, "%s", name);
>  		}
> @@ -809,7 +810,8 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data,
>  
>  	if (!isfirst) {
>  		close_json_array(PRINT_JSON, NULL);
> -		newline(rd);
> +		close_json_object();
> +		newline();
>  	}
>  
>  	return 0;
> @@ -1052,7 +1054,6 @@ static int stat_unset(struct rd *rd)
>  static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data)
>  {
>  	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
> -	struct rd *rd = data;
>  	const char *name;
>  	uint32_t port;
>  	int ret;
> @@ -1068,9 +1069,10 @@ static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data)
>  	open_json_object(NULL);
>  	print_string(PRINT_ANY, "ifname", "link %s/", name);
>  	print_uint(PRINT_ANY, "port", "%u ", port);
> -	ret = res_get_hwcounters(rd, tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
> +	ret = res_get_hwcounters(tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true);
>  
> -	newline(rd);
> +	close_json_object();
> +	newline();
>  	return ret;
>  }
>  
> diff --git a/rdma/stat.h b/rdma/stat.h
> index b03a10c9eef6..5adcf4f37e20 100644
> --- a/rdma/stat.h
> +++ b/rdma/stat.h
> @@ -9,9 +9,7 @@
>  
>  #include "rdma.h"
>  
> -int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table,
> -		       bool print);
> -
> +int res_get_hwcounters(struct nlattr *hwc_table, bool print);
>  int stat_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
>  int stat_mr_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
>  
> diff --git a/rdma/utils.c b/rdma/utils.c
> index aeb627be7715..27595a387faa 100644
> --- a/rdma/utils.c
> +++ b/rdma/utils.c
> @@ -642,6 +642,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd))
>  	}
>  out:
>  	delete_json_obj();
> +
>  	return ret;
>  }
>  
> @@ -771,28 +772,29 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index)
>  
>  #define nla_type(attr) ((attr)->nla_type & NLA_TYPE_MASK)
>  
> -void newline(struct rd *rd)
> +/* End of device object always print a newline */
> +void newline(void)
>  {
> -	close_json_object();
> -	print_nl();
> +	putchar('\n');
> +	fflush(stdout);
>  }
>  
> -void newline_indent(struct rd *rd)
> +/* End of partial multi-line segment of a device object */
> +void newline_indent(void)
>  {
> -	newline(rd);
> -	print_string(PRINT_FP, NULL, "    ", NULL);
> +	if (!is_json_context())
> +		printf("%s    ", _SL_);
>  }
>  
> -static int print_driver_string(struct rd *rd, const char *key_str,
> -				 const char *val_str)
> +static int print_driver_string(const char *key_str, const char *val_str)
>  {
>  	print_string(PRINT_ANY, key_str, key_str, val_str);
>  	print_string(PRINT_FP, NULL, " %s ", val_str);
>  	return 0;
>  }
>  
> -static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
> -			      enum rdma_nldev_print_type print_type)
> +static int print_driver_s32(const char *key_str, int32_t val,
> +			    enum rdma_nldev_print_type print_type)
>  {
>  	if (!is_json_context()) {
>  		switch (print_type) {
> @@ -808,8 +810,8 @@ static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
>  	return 0;
>  }
>  
> -static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
> -			      enum rdma_nldev_print_type print_type)
> +static int print_driver_u32(const char *key_str, uint32_t val,
> +			    enum rdma_nldev_print_type print_type)
>  {
>  	if (!is_json_context()) {
>  		switch (print_type) {
> @@ -825,8 +827,8 @@ static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val,
>  	return 0;
>  }
>  
> -static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
> -			      enum rdma_nldev_print_type print_type)
> +static int print_driver_s64(const char *key_str, int64_t val,
> +			    enum rdma_nldev_print_type print_type)
>  {
>  	if (!is_json_context()) {
>  		switch (print_type) {
> @@ -842,8 +844,8 @@ static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val,
>  	return 0;
>  }
>  
> -static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val,
> -			      enum rdma_nldev_print_type print_type)
> +static int print_driver_u64(const char *key_str, uint64_t val,
> +			    enum rdma_nldev_print_type print_type)
>  {
>  	if (!is_json_context()) {
>  		switch (print_type) {
> @@ -859,9 +861,8 @@ static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val,
>  	return 0;
>  }
>  
> -static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
> -				struct nlattr *val_attr,
> -				enum rdma_nldev_print_type print_type)
> +static int print_driver_entry(struct nlattr *key_attr, struct nlattr *val_attr,
> +			      enum rdma_nldev_print_type print_type)
>  {
>  	int attr_type = nla_type(val_attr);
>  	int ret = -EINVAL;
> @@ -872,19 +873,19 @@ static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
>  
>  	switch (attr_type) {
>  	case RDMA_NLDEV_ATTR_DRIVER_STRING:
> -		ret = print_driver_string(rd, key_str, mnl_attr_get_str(val_attr));
> +		ret = print_driver_string(key_str, mnl_attr_get_str(val_attr));
>  		break;
>  	case RDMA_NLDEV_ATTR_DRIVER_S32:
> -		ret = print_driver_s32(rd, key_str, mnl_attr_get_u32(val_attr), print_type);
> +		ret = print_driver_s32(key_str, mnl_attr_get_u32(val_attr), print_type);
>  		break;
>  	case RDMA_NLDEV_ATTR_DRIVER_U32:
> -		ret = print_driver_u32(rd, key_str, mnl_attr_get_u32(val_attr), print_type);
> +		ret = print_driver_u32(key_str, mnl_attr_get_u32(val_attr), print_type);
>  		break;
>  	case RDMA_NLDEV_ATTR_DRIVER_S64:
> -		ret = print_driver_s64(rd, key_str, mnl_attr_get_u64(val_attr), print_type);
> +		ret = print_driver_s64(key_str, mnl_attr_get_u64(val_attr), print_type);
>  		break;
>  	case RDMA_NLDEV_ATTR_DRIVER_U64:
> -		ret = print_driver_u64(rd, key_str, mnl_attr_get_u64(val_attr), print_type);
> +		ret = print_driver_u64(key_str, mnl_attr_get_u64(val_attr), print_type);
>  		break;
>  	}
>  	free(key_str);
> @@ -920,7 +921,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
>  	if (!rd->show_driver_details || !tb)
>  		return;
>  
> -	newline_indent(rd);
> +	newline_indent();
>  
>  	/*
>  	 * Driver attrs are tuples of {key, [print-type], value}.
> @@ -932,7 +933,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
>  	mnl_attr_for_each_nested(tb_entry, tb) {
>  
>  		if (cc > MAX_LINE_LENGTH) {
> -			newline_indent(rd);
> +			newline_indent();
>  			cc = 0;
>  		}
>  		if (rd_attr_check(tb_entry, &type) != MNL_CB_OK)
> @@ -945,7 +946,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb)
>  			print_type = mnl_attr_get_u8(tb_entry);
>  		} else {
>  			val = tb_entry;
> -			ret = print_driver_entry(rd, key, val, print_type);
> +			ret = print_driver_entry(key, val, print_type);
>  			if (ret < 0)
>  				return;
>  			cc += ret;


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 0/6] rdma: print related patches
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
                   ` (6 preceding siblings ...)
  2024-01-04  5:58 ` [PATCH v2 iproute2 0/6] rdma: print related patches Chengchang Tang
@ 2024-01-07  8:20 ` Leon Romanovsky
  2024-01-07 17:30 ` patchwork-bot+netdevbpf
  8 siblings, 0 replies; 15+ messages in thread
From: Leon Romanovsky @ 2024-01-07  8:20 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

On Wed, Jan 03, 2024 at 05:13:38PM -0800, Stephen Hemminger wrote:
> This set of patches makes rdma comman behave more like the
> other commands in iproute2 around printing flags.
> There are some other things found while looking at that code.
> 
> This version keeps similar function names to original
> 
> Stephen Hemminger (6):
>   rdma: shorten print_ lines
>   rdma: use standard flag for json
>   rdma: make pretty behave like other commands
>   rdma: make supress_errors a bit
>   rdma: add oneline flag
>   rdma: do not mix newline and json object

Hi Stephen,

We tested this series and it works correctly for us.

Thanks,
Tested-by: Leon Romanovsky <leonro@nvidia.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 iproute2 0/6] rdma: print related patches
  2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
                   ` (7 preceding siblings ...)
  2024-01-07  8:20 ` Leon Romanovsky
@ 2024-01-07 17:30 ` patchwork-bot+netdevbpf
  8 siblings, 0 replies; 15+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-01-07 17:30 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: leon, netdev

Hello:

This series was applied to iproute2/iproute2.git (main)
by Stephen Hemminger <stephen@networkplumber.org>:

On Wed,  3 Jan 2024 17:13:38 -0800 you wrote:
> This set of patches makes rdma comman behave more like the
> other commands in iproute2 around printing flags.
> There are some other things found while looking at that code.
> 
> This version keeps similar function names to original
> 
> Stephen Hemminger (6):
>   rdma: shorten print_ lines
>   rdma: use standard flag for json
>   rdma: make pretty behave like other commands
>   rdma: make supress_errors a bit
>   rdma: add oneline flag
>   rdma: do not mix newline and json object
> 
> [...]

Here is the summary with links:
  - [v2,iproute2,1/6] rdma: shorten print_ lines
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=674e00aeaba7
  - [v2,iproute2,2/6] rdma: use standard flag for json
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=22edc0cf37cd
  - [v2,iproute2,3/6] rdma: make pretty behave like other commands
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=f962b24a5a33
  - [v2,iproute2,4/6] rdma: make supress_errors a bit
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=6e0d4e91a554
  - [v2,iproute2,5/6] rdma: add oneline flag
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=27a477ba80da
  - [v2,iproute2,6/6] rdma: do not mix newline and json object
    https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=a903854bad1c

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2024-01-07 17:30 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-04  1:13 [PATCH v2 iproute2 0/6] rdma: print related patches Stephen Hemminger
2024-01-04  1:13 ` [PATCH v2 iproute2 1/6] rdma: shorten print_ lines Stephen Hemminger
2024-01-04 11:28   ` Petr Machata
2024-01-04  1:13 ` [PATCH v2 iproute2 2/6] rdma: use standard flag for json Stephen Hemminger
2024-01-04 12:07   ` Petr Machata
2024-01-04  1:13 ` [PATCH v2 iproute2 3/6] rdma: make pretty behave like other commands Stephen Hemminger
2024-01-04  1:13 ` [PATCH v2 iproute2 4/6] rdma: make supress_errors a bit Stephen Hemminger
2024-01-04 14:17   ` Petr Machata
2024-01-04  1:13 ` [PATCH v2 iproute2 5/6] rdma: add oneline flag Stephen Hemminger
2024-01-04 14:20   ` Petr Machata
2024-01-04  1:13 ` [PATCH v2 iproute2 6/6] rdma: do not mix newline and json object Stephen Hemminger
2024-01-04 14:29   ` Petr Machata
2024-01-04  5:58 ` [PATCH v2 iproute2 0/6] rdma: print related patches Chengchang Tang
2024-01-07  8:20 ` Leon Romanovsky
2024-01-07 17:30 ` patchwork-bot+netdevbpf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.