linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH iproute2-next 00/10] RDMA resource tracking
@ 2018-01-31  8:11 Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 01/10] rdma: Add option to provide "-" sign for the port number Leon Romanovsky
                   ` (7 more replies)
  0 siblings, 8 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger

Changelog:
 v2 -> v3:
   * Rebased to commit: 1e24e773f144 ("Merge branch 'iproute2-master' into iproute2-next")
   * Refreshed include/uapi/rdma/rdma_netlink.h file
   * Fixed bug, where cxgb4 was printed twice.
 v1 -> v2;
   * Added checks for all occurrences of strdup failures and added patch
     with fix of already merged code.
   * Sync with latest kernel code.
   * Rewrote table representation to be similar to "ip route" output.
   * Implemented string filters.
   * Removed curr/max representation from the summary output.
 v0 -> v1:
   * Fixed subject title in patch #1: rdam -> rdma.
   * Added newline between variable declaration and the code.
   * Add check to failure in strdup() call in rd_check_is_string_filtered().
   * Rewrote res_qp_parse_cb() to avoid long lines and extra indentation.

------------------------------------------------------------------------

David, Stephen,

The kernel code is accepted to the RDMA and will be sent to Linus in
this merge window, and this is refreshed version of user space part.

Because, I found bug in handling cxgb4 devices and we cleaned header
file a little bit more, it was more wise to resend the series instead
of applying v2.

https://patchwork.ozlabs.org/project/netdev/list/?series=RDMA+resource+tracking&submitter=68852&state=8&q=&archive=&delegate=

Thanks

Cc: RDMA mailing list <linux-rdma@vger.kernel.org>
Cc: Steve Wise <swise@opengridcomputing.com>

[1] https://www.spinics.net/lists/linux-rdma/msg59535.html

Leon Romanovsky (10):
  rdma: Add option to provide "-" sign for the port number
  rdma: Make visible the number of arguments
  rdma: Add filtering infrastructure
  rdma: Set pointer to device name position
  rdma: Allow external usage of compare string routine
  rdma: Update kernel header file
  rdma: Add resource tracking summary
  rdma: Add QP resource tracking information
  rdma: Document resource tracking
  rdma: Check return value of strdup call

 include/uapi/rdma/rdma_netlink.h |  67 +++++-
 man/man8/rdma-resource.8         |  86 +++++++
 rdma/Makefile                    |   2 +-
 rdma/link.c                      |   2 +-
 rdma/rdma.c                      |   4 +-
 rdma/rdma.h                      |  28 ++-
 rdma/res.c                       | 486 +++++++++++++++++++++++++++++++++++++++
 rdma/utils.c                     | 321 +++++++++++++++++++++++++-
 8 files changed, 971 insertions(+), 25 deletions(-)
 create mode 100644 man/man8/rdma-resource.8
 create mode 100644 rdma/res.c

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

* [PATCH iproute2-next 01/10] rdma: Add option to provide "-" sign for the port number
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 02/10] rdma: Make visible the number of arguments Leon Romanovsky
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

According to the IBTA spec [1], the physical connected port is provided
for the QP in RTR-to-INIT stage performed by modify_qp(). It causes
to do not have port number for newly created QPs.

The following patch adds "-" sign to present absence of port, because
QPs are going to be associated with rdmatool link object, which needs
port number as an index.

[1] InfiniBand Architecture Release 1.3 -
	"Table 96 QP State Transition Properties"

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 rdma/link.c  |  2 +-
 rdma/rdma.h  |  3 +--
 rdma/utils.c | 50 ++++++++++++++++++++++++++++++++++++++++++--------
 3 files changed, 44 insertions(+), 11 deletions(-)

diff --git a/rdma/link.c b/rdma/link.c
index 676cb21d..66bcd50e 100644
--- a/rdma/link.c
+++ b/rdma/link.c
@@ -285,7 +285,7 @@ static int link_one_show(struct rd *rd)
 
 static int link_show(struct rd *rd)
 {
-	return rd_exec_link(rd, link_one_show);
+	return rd_exec_link(rd, link_one_show, true);
 }
 
 int cmd_link(struct rd *rd)
diff --git a/rdma/rdma.h b/rdma/rdma.h
index 8d53d3a0..cbd9aa89 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -64,7 +64,6 @@ bool rd_no_arg(struct rd *rd);
 void rd_arg_inc(struct rd *rd);
 
 char *rd_argv(struct rd *rd);
-uint32_t get_port_from_argv(struct rd *rd);
 
 /*
  * Commands interface
@@ -73,7 +72,7 @@ int cmd_dev(struct rd *rd);
 int cmd_link(struct rd *rd);
 int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str);
 int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd));
-int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd));
+int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port);
 void rd_free(struct rd *rd);
 
 /*
diff --git a/rdma/utils.c b/rdma/utils.c
index 7b2001e2..b9c668a3 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -10,6 +10,7 @@
  */
 
 #include "rdma.h"
+#include <ctype.h>
 
 static int rd_argc(struct rd *rd)
 {
@@ -50,13 +51,43 @@ bool rd_no_arg(struct rd *rd)
 	return rd_argc(rd) == 0;
 }
 
-uint32_t get_port_from_argv(struct rd *rd)
+/*
+ * Possible input:output
+ * dev/port    | first port | is_dump_all
+ * mlx5_1      | 0          | true
+ * mlx5_1/     | 0          | true
+ * mlx5_1/0    | 0          | false
+ * mlx5_1/1    | 1          | false
+ * mlx5_1/-    | 0          | false
+ *
+ * In strict mode, /- will return error.
+ */
+static int get_port_from_argv(struct rd *rd, uint32_t *port,
+			      bool *is_dump_all, bool strict_port)
 {
 	char *slash;
 
+	*port = 0;
+	*is_dump_all = true;
+
 	slash = strchr(rd_argv(rd), '/');
 	/* if no port found, return 0 */
-	return slash ? atoi(slash + 1) : 0;
+	if (slash++) {
+		if (*slash == '-') {
+			if (strict_port)
+				return -EINVAL;
+			*is_dump_all = false;
+			return 0;
+		}
+
+		if (isdigit(*slash)) {
+			*is_dump_all = false;
+			*port = atoi(slash);
+		}
+		if (!*port && strlen(slash))
+			return -EINVAL;
+	}
+	return 0;
 }
 
 static struct dev_map *dev_map_alloc(const char *dev_name)
@@ -152,7 +183,7 @@ void rd_free(struct rd *rd)
 	dev_map_cleanup(rd);
 }
 
-int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd))
+int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
 {
 	struct dev_map *dev_map;
 	uint32_t port;
@@ -163,7 +194,8 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd))
 	if (rd_no_arg(rd)) {
 		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
 			rd->dev_idx = dev_map->idx;
-			for (port = 1; port < dev_map->num_ports + 1; port++) {
+			port = (strict_port) ? 1 : 0;
+			for (; port < dev_map->num_ports + 1; port++) {
 				rd->port_idx = port;
 				ret = cb(rd);
 				if (ret)
@@ -172,21 +204,23 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd))
 		}
 
 	} else {
+		bool is_dump_all;
+
 		dev_map = dev_map_lookup(rd, true);
-		port = get_port_from_argv(rd);
-		if (!dev_map || port > dev_map->num_ports) {
+		ret = get_port_from_argv(rd, &port, &is_dump_all, strict_port);
+		if (!dev_map || port > dev_map->num_ports || (!port && ret)) {
 			pr_err("Wrong device name\n");
 			ret = -ENOENT;
 			goto out;
 		}
 		rd_arg_inc(rd);
 		rd->dev_idx = dev_map->idx;
-		rd->port_idx = port ? : 1;
+		rd->port_idx = port;
 		for (; rd->port_idx < dev_map->num_ports + 1; rd->port_idx++) {
 			ret = cb(rd);
 			if (ret)
 				goto out;
-			if (port)
+			if (!is_dump_all)
 				/*
 				 * We got request to show link for devname
 				 * with port index.
-- 
2.16.1

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

* [PATCH iproute2-next 02/10] rdma: Make visible the number of arguments
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 01/10] rdma: Add option to provide "-" sign for the port number Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 04/10] rdma: Set pointer to device name position Leon Romanovsky
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 rdma/rdma.h  | 1 +
 rdma/utils.c | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/rdma/rdma.h b/rdma/rdma.h
index cbd9aa89..1b66ae04 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -74,6 +74,7 @@ int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str);
 int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd));
 int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port);
 void rd_free(struct rd *rd);
+int rd_argc(struct rd *rd);
 
 /*
  * Device manipulation
diff --git a/rdma/utils.c b/rdma/utils.c
index b9c668a3..af2b374d 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -12,7 +12,7 @@
 #include "rdma.h"
 #include <ctype.h>
 
-static int rd_argc(struct rd *rd)
+int rd_argc(struct rd *rd)
 {
 	return rd->argc;
 }
-- 
2.16.1

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

* [PATCH iproute2-next 03/10] rdma: Add filtering infrastructure
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2018-01-31  8:11   ` Leon Romanovsky
  2018-01-31  8:11   ` [PATCH iproute2-next 07/10] rdma: Add resource tracking summary Leon Romanovsky
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>

This patch adds general infrastructure to RDMAtool to handle various
filtering options needed for the downstream resource tracking patches.

The infrastructure is generic and stores filters in list of key<->value
entries. There are three types of filters:

1. Numeric - the values are intended to be digits combined with '-' to
mark range and ',' to mark multiple entries, e.g. pid 1-100,234,400-401
is perfectly legit filter to limit process ids.

2. String - the values are consist from strings and "," as a denominator.

3. Link - special case to allow '/' in string to provide link name, e.g.
link mlx4_1/2.

Signed-off-by: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
 rdma/rdma.c  |   1 +
 rdma/rdma.h  |  20 ++++++
 rdma/utils.c | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 250 insertions(+)

diff --git a/rdma/rdma.c b/rdma/rdma.c
index 0e8fd688..a21ba440 100644
--- a/rdma/rdma.c
+++ b/rdma/rdma.c
@@ -47,6 +47,7 @@ static int rd_init(struct rd *rd, int argc, char **argv, char *filename)
 	rd->argc = argc;
 	rd->argv = argv;
 	INIT_LIST_HEAD(&rd->dev_map_list);
+	INIT_LIST_HEAD(&rd->filter_list);
 
 	if (rd->json_output) {
 		rd->jw = jsonw_new(stdout);
diff --git a/rdma/rdma.h b/rdma/rdma.h
index 1b66ae04..8e60ce26 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -29,6 +29,18 @@
 #define RDMA_BITMAP_ENUM(name, bit_no) RDMA_BITMAP_##name = BIT(bit_no),
 #define RDMA_BITMAP_NAMES(name, bit_no) [bit_no] = #name,
 
+#define MAX_NUMBER_OF_FILTERS 64
+struct filters {
+	char name[32];
+	bool is_number;
+};
+
+struct filter_entry {
+	struct list_head list;
+	char *key;
+	char *value;
+};
+
 struct dev_map {
 	struct list_head list;
 	char *dev_name;
@@ -50,6 +62,7 @@ struct rd {
 	json_writer_t *jw;
 	bool json_output;
 	bool pretty_output;
+	struct list_head filter_list;
 };
 
 struct rd_cmd {
@@ -81,6 +94,13 @@ int rd_argc(struct rd *rd);
  */
 struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index);
 
+/*
+ * Filter manipulation
+ */
+int rd_build_filter(struct rd *rd, const struct filters valid_filters[]);
+bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val);
+bool rd_check_is_string_filtered(struct rd *rd, const char *key, const char *val);
+bool rd_check_is_key_exist(struct rd *rd, const char *key);
 /*
  * Netlink
  */
diff --git a/rdma/utils.c b/rdma/utils.c
index af2b374d..157699c0 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -114,6 +114,234 @@ static void dev_map_cleanup(struct rd *rd)
 	}
 }
 
+static int add_filter(struct rd *rd, char *key, char *value,
+		      const struct filters valid_filters[])
+{
+	char cset[] = "1234567890,-";
+	struct filter_entry *fe;
+	bool key_found = false;
+	int idx = 0;
+	int ret;
+
+	fe = calloc(1, sizeof(*fe));
+	if (!fe)
+		return -ENOMEM;
+
+	while (idx < MAX_NUMBER_OF_FILTERS && valid_filters[idx].name) {
+		if (!strcmpx(key, valid_filters[idx].name)) {
+			key_found = true;
+			break;
+		}
+		idx++;
+	}
+	if (!key_found) {
+		pr_err("Unsupported filter option: %s\n", key);
+		ret = -EINVAL;
+		goto err;
+	}
+
+	/*
+	 * Check the filter validity, not optimal, but works
+	 *
+	 * Actually, there are three types of filters
+	 *  numeric - for example PID or QPN
+	 *  string  - for example states
+	 *  link    - user requested to filter on specific link
+	 *            e.g. mlx5_1/1, mlx5_1/-, mlx5_1 ...
+	 */
+	if (valid_filters[idx].is_number &&
+	    strspn(value, cset) != strlen(value)) {
+		pr_err("%s filter accepts \"%s\" characters only\n", key, cset);
+		ret = -EINVAL;
+		goto err;
+	}
+
+	fe->key = strdup(key);
+	fe->value = strdup(value);
+	if (!fe->key || !fe->value) {
+		ret = -ENOMEM;
+		goto err_alloc;
+	}
+
+	for (idx = 0; idx < strlen(fe->value); idx++)
+		fe->value[idx] = tolower(fe->value[idx]);
+
+	list_add_tail(&fe->list, &rd->filter_list);
+	return 0;
+
+err_alloc:
+	free(fe->value);
+	free(fe->key);
+err:
+	free(fe);
+	return ret;
+}
+
+int rd_build_filter(struct rd *rd, const struct filters valid_filters[])
+{
+	int ret = 0;
+	int idx = 0;
+
+	if (!valid_filters || !rd_argc(rd))
+		goto out;
+
+	if (rd_argc(rd) == 1) {
+		pr_err("No filter data was supplied to filter option %s\n", rd_argv(rd));
+		ret = -EINVAL;
+		goto out;
+	}
+
+	if (rd_argc(rd) % 2) {
+		pr_err("There is filter option without data\n");
+		ret = -EINVAL;
+		goto out;
+	}
+
+	while (idx != rd_argc(rd)) {
+		/*
+		 * We can do micro-optimization and skip "dev"
+		 * and "link" filters, but it is not worth of it.
+		 */
+		ret = add_filter(rd, *(rd->argv + idx),
+				 *(rd->argv + idx + 1), valid_filters);
+		if (ret)
+			goto out;
+		idx += 2;
+	}
+
+out:
+	return ret;
+}
+
+bool rd_check_is_key_exist(struct rd *rd, const char *key)
+{
+	struct filter_entry *fe;
+
+	list_for_each_entry(fe, &rd->filter_list, list) {
+		if (!strcmpx(fe->key, key))
+			return true;
+	}
+
+	return false;
+}
+
+/*
+ * Check if string entry is filtered:
+ *  * key doesn't exist -> user didn't request -> not filtered
+ */
+bool rd_check_is_string_filtered(struct rd *rd,
+				 const char *key, const char *val)
+{
+	bool key_is_filtered = false;
+	struct filter_entry *fe;
+	char *p = NULL;
+	char *str;
+
+	list_for_each_entry(fe, &rd->filter_list, list) {
+		if (!strcmpx(fe->key, key)) {
+			/* We found the key */
+			p = strdup(fe->value);
+			key_is_filtered = true;
+			if (!p) {
+				/*
+				 * Something extremely wrong if we fail
+				 * to allocate small amount of bytes.
+				 */
+				pr_err("Found key, but failed to allocate memory to store value\n");
+				return key_is_filtered;
+			}
+
+			/*
+			 * Need to check if value in range
+			 * It can come in the following formats
+			 * and their permutations:
+			 * str
+			 * str1,str2
+			 */
+			str = strtok(p, ",");
+			while (str) {
+				if (strlen(str) == strlen(val) &&
+				    !strcasecmp(str, val)) {
+					key_is_filtered = false;
+					goto out;
+				}
+				str = strtok(NULL, ",");
+			}
+			goto out;
+		}
+	}
+
+out:
+	free(p);
+	return key_is_filtered;
+}
+
+/*
+ * Check if key is filtered:
+ * key doesn't exist -> user didn't request -> not filtered
+ */
+bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val)
+{
+	bool key_is_filtered = false;
+	struct filter_entry *fe;
+
+	list_for_each_entry(fe, &rd->filter_list, list) {
+		uint32_t left_val = 0, fe_value = 0;
+		bool range_check = false;
+		char *p = fe->value;
+
+		if (!strcmpx(fe->key, key)) {
+			/* We found the key */
+			key_is_filtered = true;
+			/*
+			 * Need to check if value in range
+			 * It can come in the following formats
+			 * (and their permutations):
+			 * numb
+			 * numb1,numb2
+			 * ,numb1,numb2
+			 * numb1-numb2
+			 * numb1,numb2-numb3,numb4-numb5
+			 */
+			while (*p) {
+				if (isdigit(*p)) {
+					fe_value = strtol(p, &p, 10);
+					if (fe_value == val ||
+					    (range_check && left_val < val &&
+					     val < fe_value)) {
+						key_is_filtered = false;
+						goto out;
+					}
+					range_check = false;
+				} else {
+					if (*p == '-') {
+						left_val = fe_value;
+						range_check = true;
+					}
+					p++;
+				}
+			}
+			goto out;
+		}
+	}
+
+out:
+	return key_is_filtered;
+}
+
+static void filters_cleanup(struct rd *rd)
+{
+	struct filter_entry *fe, *tmp;
+
+	list_for_each_entry_safe(fe, tmp,
+				 &rd->filter_list, list) {
+		list_del(&fe->list);
+		free(fe->key);
+		free(fe->value);
+		free(fe);
+	}
+}
+
 static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_DEV_INDEX] = MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
@@ -181,6 +409,7 @@ void rd_free(struct rd *rd)
 		return;
 	free(rd->buff);
 	dev_map_cleanup(rd);
+	filters_cleanup(rd);
 }
 
 int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
-- 
2.16.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH iproute2-next 04/10] rdma: Set pointer to device name position
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 01/10] rdma: Add option to provide "-" sign for the port number Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 02/10] rdma: Make visible the number of arguments Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 05/10] rdma: Allow external usage of compare string routine Leon Romanovsky
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

The dev and link execution callbacks expects that next
command line argument is device or port name.

Set pointer to device or port name position prior calls to
rd_exec_dev()/rd_exec_link().

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 rdma/rdma.h  |  1 +
 rdma/utils.c | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/rdma/rdma.h b/rdma/rdma.h
index 8e60ce26..35506a96 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -87,6 +87,7 @@ int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str);
 int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd));
 int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port);
 void rd_free(struct rd *rd);
+int rd_set_arg_to_devname(struct rd *rd);
 int rd_argc(struct rd *rd);
 
 /*
diff --git a/rdma/utils.c b/rdma/utils.c
index 157699c0..f93f05e1 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -412,6 +412,25 @@ void rd_free(struct rd *rd)
 	filters_cleanup(rd);
 }
 
+int rd_set_arg_to_devname(struct rd *rd)
+{
+	int ret = 0;
+
+	while (!rd_no_arg(rd)) {
+		if (rd_argv_match(rd, "dev") || rd_argv_match(rd, "link")) {
+			rd_arg_inc(rd);
+			if (rd_no_arg(rd)) {
+				pr_err("No device name was supplied\n");
+				ret = -EINVAL;
+			}
+			goto out;
+		}
+		rd_arg_inc(rd);
+	}
+out:
+	return ret;
+}
+
 int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
 {
 	struct dev_map *dev_map;
-- 
2.16.1

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

* [PATCH iproute2-next 05/10] rdma: Allow external usage of compare string routine
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
                   ` (2 preceding siblings ...)
  2018-01-31  8:11 ` [PATCH iproute2-next 04/10] rdma: Set pointer to device name position Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 06/10] rdma: Update kernel header file Leon Romanovsky
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 rdma/rdma.h  | 2 ++
 rdma/utils.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/rdma/rdma.h b/rdma/rdma.h
index 35506a96..d2cde895 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -90,6 +90,8 @@ void rd_free(struct rd *rd);
 int rd_set_arg_to_devname(struct rd *rd);
 int rd_argc(struct rd *rd);
 
+int strcmpx(const char *str1, const char *str2);
+
 /*
  * Device manipulation
  */
diff --git a/rdma/utils.c b/rdma/utils.c
index f93f05e1..9e15b7cf 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -24,7 +24,7 @@ char *rd_argv(struct rd *rd)
 	return *rd->argv;
 }
 
-static int strcmpx(const char *str1, const char *str2)
+int strcmpx(const char *str1, const char *str2)
 {
 	if (strlen(str1) > strlen(str2))
 		return -1;
-- 
2.16.1

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

* [PATCH iproute2-next 06/10] rdma: Update kernel header file
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
                   ` (3 preceding siblings ...)
  2018-01-31  8:11 ` [PATCH iproute2-next 05/10] rdma: Allow external usage of compare string routine Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 09/10] rdma: Document resource tracking Leon Romanovsky
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

Synchronize iporute2 package with latest kernel
RDMA netlink header file.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 include/uapi/rdma/rdma_netlink.h | 67 ++++++++++++++++++++++++++++++++++------
 1 file changed, 57 insertions(+), 10 deletions(-)

diff --git a/include/uapi/rdma/rdma_netlink.h b/include/uapi/rdma/rdma_netlink.h
index 48fbf3c3..4c77e2a7 100644
--- a/include/uapi/rdma/rdma_netlink.h
+++ b/include/uapi/rdma/rdma_netlink.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#ifndef _RDMA_NETLINK_H
-#define _RDMA_NETLINK_H
+#ifndef _UAPI_RDMA_NETLINK_H
+#define _UAPI_RDMA_NETLINK_H
 
 #include <linux/types.h>
 
@@ -227,14 +227,16 @@ enum rdma_nldev_command {
 	RDMA_NLDEV_CMD_UNSPEC,
 
 	RDMA_NLDEV_CMD_GET, /* can dump */
-	RDMA_NLDEV_CMD_SET,
-	RDMA_NLDEV_CMD_NEW,
-	RDMA_NLDEV_CMD_DEL,
 
-	RDMA_NLDEV_CMD_PORT_GET, /* can dump */
-	RDMA_NLDEV_CMD_PORT_SET,
-	RDMA_NLDEV_CMD_PORT_NEW,
-	RDMA_NLDEV_CMD_PORT_DEL,
+	/* 2 - 4 are free to use */
+
+	RDMA_NLDEV_CMD_PORT_GET = 5, /* can dump */
+
+	/* 6 - 8 are free to use */
+
+	RDMA_NLDEV_CMD_RES_GET = 9, /* can dump */
+
+	RDMA_NLDEV_CMD_RES_QP_GET, /* can dump */
 
 	RDMA_NLDEV_NUM_OPS
 };
@@ -303,6 +305,51 @@ enum rdma_nldev_attr {
 
 	RDMA_NLDEV_ATTR_DEV_NODE_TYPE,		/* u8 */
 
+	RDMA_NLDEV_ATTR_RES_SUMMARY,		/* nested table */
+	RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY,	/* nested table */
+	RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME,	/* string */
+	RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR,	/* u64 */
+
+	RDMA_NLDEV_ATTR_RES_QP,			/* nested table */
+	RDMA_NLDEV_ATTR_RES_QP_ENTRY,		/* nested table */
+	/*
+	 * Local QPN
+	 */
+	RDMA_NLDEV_ATTR_RES_LQPN,		/* u32 */
+	/*
+	 * Remote QPN,
+	 * Applicable for RC and UC only IBTA 11.2.5.3 QUERY QUEUE PAIR
+	 */
+	RDMA_NLDEV_ATTR_RES_RQPN,		/* u32 */
+	/*
+	 * Receive Queue PSN,
+	 * Applicable for RC and UC only 11.2.5.3 QUERY QUEUE PAIR
+	 */
+	RDMA_NLDEV_ATTR_RES_RQ_PSN,		/* u32 */
+	/*
+	 * Send Queue PSN
+	 */
+	RDMA_NLDEV_ATTR_RES_SQ_PSN,		/* u32 */
+	RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE,	/* u8 */
+	/*
+	 * QP types as visible to RDMA/core, the reserved QPT
+	 * are not exported through this interface.
+	 */
+	RDMA_NLDEV_ATTR_RES_TYPE,		/* u8 */
+	RDMA_NLDEV_ATTR_RES_STATE,		/* u8 */
+	/*
+	 * Process ID which created object,
+	 * in case of kernel origin, PID won't exist.
+	 */
+	RDMA_NLDEV_ATTR_RES_PID,		/* u32 */
+	/*
+	 * The name of process created following resource.
+	 * It will exist only for kernel objects.
+	 * For user created objects, the user is supposed
+	 * to read /proc/PID/comm file.
+	 */
+	RDMA_NLDEV_ATTR_RES_KERN_NAME,		/* string */
+
 	RDMA_NLDEV_ATTR_MAX
 };
-#endif /* _RDMA_NETLINK_H */
+#endif /* _UAPI_RDMA_NETLINK_H */
-- 
2.16.1

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

* [PATCH iproute2-next 07/10] rdma: Add resource tracking summary
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2018-01-31  8:11   ` [PATCH iproute2-next 03/10] rdma: Add filtering infrastructure Leon Romanovsky
@ 2018-01-31  8:11   ` Leon Romanovsky
  2018-01-31  8:11   ` [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information Leon Romanovsky
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>

The global resource summary information. The object names, current utilization
and maximum numbers are received as is from the kernel.

$ rdma res
1: mlx5_0: pd 3 cq 5 qp 4
2: mlx5_1: pd 3 cq 5 qp 4
3: mlx5_2: pd 3 cq 5 qp 4
4: mlx5_3: pd 2 cq 3 qp 2
5: mlx5_4: pd 3 cq 5 qp 4

$ rdma res show mlx5_4
5: mlx5_4: pd 3 cq 5 qp 44

Signed-off-by: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
 rdma/Makefile |   2 +-
 rdma/rdma.c   |   3 +-
 rdma/rdma.h   |   1 +
 rdma/res.c    | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/utils.c  |   4 ++
 5 files changed, 169 insertions(+), 2 deletions(-)
 create mode 100644 rdma/res.c

diff --git a/rdma/Makefile b/rdma/Makefile
index 454f25f8..360f09b2 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -5,7 +5,7 @@ TARGETS :=
 
 ifeq ($(HAVE_MNL),y)
 
-RDMA_OBJ = rdma.o utils.o dev.o link.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o res.o
 
 TARGETS += rdma
 endif
diff --git a/rdma/rdma.c b/rdma/rdma.c
index a21ba440..19608f41 100644
--- a/rdma/rdma.c
+++ b/rdma/rdma.c
@@ -15,7 +15,7 @@
 static void help(char *name)
 {
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
-	       "where  OBJECT := { dev | link | help }\n"
+	       "where  OBJECT := { dev | link | resource | help }\n"
 	       "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty]}\n", name);
 }
 
@@ -32,6 +32,7 @@ static int rd_cmd(struct rd *rd)
 		{ "help",	cmd_help },
 		{ "dev",	cmd_dev },
 		{ "link",	cmd_link },
+		{ "resource",	cmd_res },
 		{ 0 }
 	};
 
diff --git a/rdma/rdma.h b/rdma/rdma.h
index d2cde895..5809f706 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -83,6 +83,7 @@ char *rd_argv(struct rd *rd);
  */
 int cmd_dev(struct rd *rd);
 int cmd_link(struct rd *rd);
+int cmd_res(struct rd *rd);
 int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str);
 int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd));
 int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port);
diff --git a/rdma/res.c b/rdma/res.c
new file mode 100644
index 00000000..bd97c58e
--- /dev/null
+++ b/rdma/res.c
@@ -0,0 +1,161 @@
+/*
+ * res.c	RDMA tool
+ *
+ *              This program is free software; you can redistribute it and/or
+ *              modify it under the terms of the GNU General Public License
+ *              as published by the Free Software Foundation; either version
+ *              2 of the License, or (at your option) any later version.
+ *
+ * Authors:     Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
+ */
+
+#include "rdma.h"
+#include <inttypes.h>
+
+static int res_help(struct rd *rd)
+{
+	pr_out("Usage: %s resource\n", rd->filename);
+	pr_out("          resource show [DEV]\n");
+	return 0;
+}
+
+static int res_print_summary(struct rd *rd, struct nlattr **tb)
+{
+	struct nlattr *nla_table = tb[RDMA_NLDEV_ATTR_RES_SUMMARY];
+	struct nlattr *nla_entry;
+	const char *name;
+	uint64_t curr;
+	int err;
+
+	mnl_attr_for_each_nested(nla_entry, nla_table) {
+		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+		char json_name[32];
+
+		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
+		if (err != MNL_CB_OK)
+			return -EINVAL;
+
+		if (!nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] ||
+		    !nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]) {
+			return -EINVAL;
+		}
+
+		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]);
+		if (rd->json_output) {
+			snprintf(json_name, 32, "%s", name);
+			jsonw_lluint_field(rd->jw, json_name, curr);
+		} else {
+			pr_out("%s %"PRId64 " ", name, curr);
+		}
+	}
+	return 0;
+}
+
+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;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
+	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
+	    !tb[RDMA_NLDEV_ATTR_RES_SUMMARY])
+		return MNL_CB_ERROR;
+
+	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
+	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
+	if (rd->json_output) {
+		jsonw_uint_field(rd->jw, "ifindex", idx);
+		jsonw_string_field(rd->jw, "ifname", name);
+	} else {
+		pr_out("%u: %s: ", idx, name);
+	}
+
+	res_print_summary(rd, tb);
+
+	if (!rd->json_output)
+		pr_out("\n");
+	return MNL_CB_OK;
+}
+
+static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback)
+{
+	uint32_t flags = NLM_F_REQUEST | NLM_F_ACK;
+	uint32_t seq;
+	int ret;
+
+	if (command != RDMA_NLDEV_CMD_RES_GET)
+		flags |= NLM_F_DUMP;
+
+	rd_prepare_msg(rd, command, &seq, flags);
+	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
+	if (rd->port_idx)
+		mnl_attr_put_u32(rd->nlh,
+				 RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx);
+
+	ret = rd_send_msg(rd);
+	if (ret)
+		return ret;
+
+	if (rd->json_output)
+		jsonw_start_object(rd->jw);
+	ret = rd_recv_msg(rd, callback, rd, seq);
+	if (rd->json_output)
+		jsonw_end_object(rd->jw);
+	return ret;
+}
+
+#define RES_FUNC(name, command, valid_filters, strict_port) \
+	static int _##name(struct rd *rd)\
+	{ \
+		return _res_send_msg(rd, command, name##_parse_cb); \
+	} \
+	static int name(struct rd *rd) \
+	{\
+		int ret = rd_build_filter(rd, valid_filters); \
+		if (ret) \
+			return ret; \
+		if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \
+			ret = rd_set_arg_to_devname(rd); \
+			if (ret) \
+				return ret;\
+		} \
+		if (strict_port) \
+			return rd_exec_dev(rd, _##name); \
+		else \
+			return rd_exec_link(rd, _##name, strict_port); \
+	}
+
+RES_FUNC(res_no_args,	RDMA_NLDEV_CMD_RES_GET,	NULL, true);
+
+static int res_show(struct rd *rd)
+{
+	const struct rd_cmd cmds[] = {
+		{ NULL,		res_no_args	},
+		{ 0 }
+	};
+
+	/*
+	 * Special case to support "rdma res show DEV_NAME"
+	 */
+	if (rd_argc(rd) == 1 && dev_map_lookup(rd, false))
+		return rd_exec_dev(rd, _res_no_args);
+
+	return rd_exec_cmd(rd, cmds, "parameter");
+}
+
+int cmd_res(struct rd *rd)
+{
+	const struct rd_cmd cmds[] = {
+		{ NULL,		res_show },
+		{ "show",	res_show },
+		{ "list",	res_show },
+		{ "help",	res_help },
+		{ 0 }
+	};
+
+	return rd_exec_cmd(rd, cmds, "resource command");
+}
diff --git a/rdma/utils.c b/rdma/utils.c
index 9e15b7cf..344f0a93 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -356,6 +356,10 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_PORT_STATE] = MNL_TYPE_U8,
 	[RDMA_NLDEV_ATTR_PORT_PHYS_STATE] = MNL_TYPE_U8,
 	[RDMA_NLDEV_ATTR_DEV_NODE_TYPE] = MNL_TYPE_U8,
+	[RDMA_NLDEV_ATTR_RES_SUMMARY]	= MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY]	= MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] = MNL_TYPE_NUL_STRING,
+	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR] = MNL_TYPE_U64,
 };
 
 int rd_attr_cb(const struct nlattr *attr, void *data)
-- 
2.16.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2018-01-31  8:11   ` [PATCH iproute2-next 03/10] rdma: Add filtering infrastructure Leon Romanovsky
  2018-01-31  8:11   ` [PATCH iproute2-next 07/10] rdma: Add resource tracking summary Leon Romanovsky
@ 2018-01-31  8:11   ` Leon Romanovsky
       [not found]     ` <20180131081156.19607-9-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2018-01-31  8:17   ` [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
  2018-02-06  1:25   ` Stephen Hemminger
  4 siblings, 1 reply; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>

This patch adds ss-similar interface to view various resource
tracked objects. At this stage, only QP is presented.

1. Get all QPs for the specific device:
$ rdma res show qp link mlx5_4
link mlx5_4/- lqpn 8 type UD state RESET sq-psn 0 pid 0 comm [ib_ipoib]
link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]

$ rdma res show qp link mlx5_4/
link mlx5_4/- lqpn 8 type UD state RESET sq-psn 0 pid 0 comm [ib_ipoib]
link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]

2. Provide illegal port number (0 is illegal):
$ rdma res show qp link mlx5_4/0
Wrong device name

3. Get QPs of specific port:
$ rdma res show qp link mlx5_4/1
link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]

4. Get QPs which have not assigned port yet:
link mlx5_4/- lqpn 8 type UD state RESET sq-psn 0 pid 0 comm [ib_ipoib]

5. Limit to specific Local QPNs:
$ rdma res show qp link mlx5_4/1 lqpn 1-3,7
link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]

. Filter types (strings):
$ rdma res show qp link mlx5_4/1 type UD,gSi
link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]

Signed-off-by: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
 rdma/res.c   | 325 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/utils.c |  11 ++
 2 files changed, 336 insertions(+)

diff --git a/rdma/res.c b/rdma/res.c
index bd97c58e..2a63e712 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -16,6 +16,9 @@ static int res_help(struct rd *rd)
 {
 	pr_out("Usage: %s resource\n", rd->filename);
 	pr_out("          resource show [DEV]\n");
+	pr_out("          resource show [qp]\n");
+	pr_out("          resource show qp link [DEV/PORT]\n");
+	pr_out("          resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
 	return 0;
 }
 
@@ -129,12 +132,334 @@ static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback)
 			return rd_exec_link(rd, _##name, strict_port); \
 	}
 
+static const char *path_mig_to_str(uint8_t idx)
+{
+	static const char * const path_mig_str[] = { "MIGRATED",
+						     "REARM", "ARMED" };
+
+	if (idx < ARRAY_SIZE(path_mig_str))
+		return path_mig_str[idx];
+	return "UNKNOWN";
+}
+
+static const char *qp_states_to_str(uint8_t idx)
+{
+	static const char * const qp_states_str[] = { "RESET", "INIT",
+						      "RTR", "RTS", "SQD",
+						      "SQE", "ERR" };
+
+	if (idx < ARRAY_SIZE(qp_states_str))
+		return qp_states_str[idx];
+	return "UNKNOWN";
+}
+
+static const char *qp_types_to_str(uint8_t idx)
+{
+	static const char * const qp_types_str[] = { "SMI", "GSI", "RC",
+						     "UC", "UD", "RAW_IPV6",
+						     "RAW_ETHERTYPE",
+						     "UNKNOWN", "RAW_PACKET",
+						     "XRC_INI", "XRC_TGT" };
+
+	if (idx < ARRAY_SIZE(qp_types_str))
+		return qp_types_str[idx];
+	return "UNKNOWN";
+}
+
+static void print_lqpn(struct rd *rd, uint32_t val)
+{
+	if (rd->json_output)
+		jsonw_uint_field(rd->jw, "lqpn", val);
+	else
+		pr_out("lqpn %u ", val);
+}
+
+static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+{
+	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
+		return;
+
+	if (rd->json_output)
+		jsonw_uint_field(rd->jw, "rqpn", val);
+	else
+		pr_out("rqpn %u ", val);
+}
+
+static void print_type(struct rd *rd, uint32_t val)
+{
+	if (rd->json_output)
+		jsonw_string_field(rd->jw, "type",
+				   qp_types_to_str(val));
+	else
+		pr_out("type %s ", qp_types_to_str(val));
+}
+
+static void print_state(struct rd *rd, uint32_t val)
+{
+	if (rd->json_output)
+		jsonw_string_field(rd->jw, "state",
+				   qp_states_to_str(val));
+	else
+		pr_out("state %s ", qp_states_to_str(val));
+}
+
+static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+{
+	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
+		return;
+
+	if (rd->json_output)
+		jsonw_uint_field(rd->jw, "rq-psn", val);
+	else
+		pr_out("rq-psn %u ", val);
+}
+
+static void print_sqpsn(struct rd *rd, uint32_t val)
+{
+	if (rd->json_output)
+		jsonw_uint_field(rd->jw, "sq-psn", val);
+	else
+		pr_out("sq-psn %u ", val);
+}
+
+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;
+
+	if (rd->json_output)
+		jsonw_string_field(rd->jw,
+				   "path-mig-state",
+				   path_mig_to_str(val));
+	else
+		pr_out("path-mig-state %s ", path_mig_to_str(val));
+}
+
+static void print_pid(struct rd *rd, uint32_t val)
+{
+	if (rd->json_output)
+		jsonw_uint_field(rd->jw, "pid", val);
+	else
+		pr_out("pid %u ", val);
+}
+
+static void print_comm(struct rd *rd, const char *str,
+		       struct nlattr **nla_line)
+{
+	char tmp[18];
+
+	if (rd->json_output) {
+		/* Don't beatify output in JSON format */
+		jsonw_string_field(rd->jw, "comm", str);
+		return;
+	}
+
+	if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+		snprintf(tmp, sizeof(tmp), "%s", str);
+	else
+		snprintf(tmp, sizeof(tmp), "[%s]", str);
+
+	pr_out("comm %s ", tmp);
+}
+
+static void print_link(struct rd *rd, uint32_t idx, const char *name,
+		       uint32_t port, struct nlattr **nla_line)
+{
+	if (rd->json_output) {
+		jsonw_uint_field(rd->jw, "ifindex", idx);
+
+		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
+			jsonw_uint_field(rd->jw, "port", port);
+
+		jsonw_string_field(rd->jw, "ifname", name);
+	} else {
+		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
+			pr_out("link %s/%u ", name, port);
+		else
+			pr_out("link %s/- ", name);
+	}
+}
+
+static char *get_task_name(uint32_t pid)
+{
+	char *comm;
+	FILE *f;
+
+	if (asprintf(&comm, "/proc/%d/comm", pid) < 0)
+		return NULL;
+
+	f = fopen(comm, "r");
+	free(comm);
+	if (!f)
+		return NULL;
+
+	if (fscanf(f, "%ms\n", &comm) != 1)
+		comm = NULL;
+
+	fclose(f);
+
+	return comm;
+}
+
+static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
+	struct nlattr *nla_table, *nla_entry;
+	struct rd *rd = data;
+	const char *name;
+	uint32_t idx;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
+	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
+	    !tb[RDMA_NLDEV_ATTR_RES_QP])
+		return MNL_CB_ERROR;
+
+	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
+	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
+	nla_table = tb[RDMA_NLDEV_ATTR_RES_QP];
+
+	mnl_attr_for_each_nested(nla_entry, nla_table) {
+		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+		uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn;
+		uint8_t type, state, path_mig_state = 0;
+		uint32_t port = 0, pid = 0;
+		char *comm = NULL;
+		int err;
+
+		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
+		if (err != MNL_CB_OK)
+			return MNL_CB_ERROR;
+
+		if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] ||
+		    !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
+		    !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
+		    !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
+		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
+		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
+			return MNL_CB_ERROR;
+		}
+
+		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
+			port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
+
+		if (port != rd->port_idx)
+			continue;
+
+		lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+		if (rd_check_is_filtered(rd, "lqpn", lqpn))
+			continue;
+
+		if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) {
+			rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]);
+			if (rd_check_is_filtered(rd, "rqpn", rqpn))
+				continue;
+		} else {
+			if (rd_check_is_key_exist(rd, "rqpn"))
+				continue;
+		}
+
+		if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
+			rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
+			if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
+				continue;
+		} else {
+			if (rd_check_is_key_exist(rd, "rq-psn"))
+				continue;
+		}
+
+		sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
+		if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
+			continue;
+
+		if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
+			path_mig_state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
+			if (rd_check_is_string_filtered(rd, "path-mig-state", path_mig_to_str(path_mig_state)))
+				continue;
+		} else {
+			if (rd_check_is_key_exist(rd, "path-mig-state"))
+				continue;
+		}
+
+		type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
+		if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type)))
+			continue;
+
+		state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
+		if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state)))
+			continue;
+
+		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
+			pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+			comm = get_task_name(pid);
+		}
+
+		if (rd_check_is_filtered(rd, "pid", pid))
+			continue;
+
+		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
+			/* discard const from mnl_attr_get_str */
+			comm = (char *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
+
+		if (rd->json_output)
+			jsonw_start_array(rd->jw);
+
+		print_link(rd, idx, name, port, nla_line);
+
+		print_lqpn(rd, lqpn);
+		print_rqpn(rd, rqpn, nla_line);
+
+		print_type(rd, type);
+		print_state(rd, state);
+
+		print_rqpsn(rd, rq_psn, nla_line);
+		print_sqpsn(rd, sq_psn);
+
+		print_pathmig(rd, path_mig_state, nla_line);
+		print_pid(rd, pid);
+		print_comm(rd, comm, nla_line);
+
+		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+			free(comm);
+
+		if (rd->json_output)
+			jsonw_end_array(rd->jw);
+		else
+			pr_out("\n");
+	}
+	return MNL_CB_OK;
+}
+
 RES_FUNC(res_no_args,	RDMA_NLDEV_CMD_RES_GET,	NULL, true);
 
+static const struct
+filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {{ .name = "link",
+						   .is_number = false },
+						   { .name = "lqpn",
+						   .is_number = true },
+						   { .name = "rqpn",
+						   .is_number = true },
+						   { .name = "pid",
+						   .is_number = true },
+						   { .name = "sq-psn",
+						   .is_number = true },
+						   { .name = "rq-psn",
+						   .is_number = true },
+						   { .name = "type",
+						   .is_number = false },
+						   { .name = "path-mig-state",
+						   .is_number = false },
+						   { .name = "state",
+						   .is_number = false } };
+
+RES_FUNC(res_qp,	RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false);
+
 static int res_show(struct rd *rd)
 {
 	const struct rd_cmd cmds[] = {
 		{ NULL,		res_no_args	},
+		{ "qp",		res_qp		},
 		{ 0 }
 	};
 
diff --git a/rdma/utils.c b/rdma/utils.c
index 344f0a93..059aa788 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -360,6 +360,17 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY]	= MNL_TYPE_NESTED,
 	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] = MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_RES_QP]		= MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_QP_ENTRY]		= MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_LQPN]	= MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_RES_RQPN]	= MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_RES_RQ_PSN]		= MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_RES_SQ_PSN]		= MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]	= MNL_TYPE_U8,
+	[RDMA_NLDEV_ATTR_RES_TYPE]		= MNL_TYPE_U8,
+	[RDMA_NLDEV_ATTR_RES_STATE]		= MNL_TYPE_U8,
+	[RDMA_NLDEV_ATTR_RES_PID]		= MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_RES_KERN_NAME]	= MNL_TYPE_NUL_STRING,
 };
 
 int rd_attr_cb(const struct nlattr *attr, void *data)
-- 
2.16.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH iproute2-next 09/10] rdma: Document resource tracking
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
                   ` (4 preceding siblings ...)
  2018-01-31  8:11 ` [PATCH iproute2-next 06/10] rdma: Update kernel header file Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
  2018-01-31  8:11 ` [PATCH iproute2-next 10/10] rdma: Check return value of strdup call Leon Romanovsky
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

Spartan version of resource tracking documentation.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 man/man8/rdma-resource.8 | 86 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 man/man8/rdma-resource.8

diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8
new file mode 100644
index 00000000..ff5d25d7
--- /dev/null
+++ b/man/man8/rdma-resource.8
@@ -0,0 +1,86 @@
+.TH RDMA\-RESOURCE 8 "26 Dec 2017" "iproute2" "Linux"
+.SH NAME
+rdma-resource \- rdma resource configuration
+.SH SYNOPSIS
+.sp
+.ad l
+.in +8
+.ti -8
+.B rdma
+.RI "[ " OPTIONS " ]"
+.B resource
+.RI  " { " COMMAND " | "
+.BR help " }"
+.sp
+
+.ti -8
+.IR OPTIONS " := { "
+\fB\-j\fR[\fIson\fR] |
+\fB\-d\fR[\fIetails\fR] }
+
+.ti -8
+.B rdma resource show
+.RI "[ " DEV/PORT_INDEX " ]"
+
+.ti -8
+.B rdma resource help
+
+.SH "DESCRIPTION"
+.SS rdma resource show - display rdma resource tracking information
+
+.PP
+.I "DEV/PORT_INDEX"
+- specifies the RDMA link to show.
+If this argument is omitted all links are listed.
+
+.SH "EXAMPLES"
+.PP
+rdma resource show
+.RS 4
+Shows summary for all devices on the system.
+.RE
+.PP
+rdma resource show mlx5_2
+.RS 4
+Shows the state of specified rdma device.
+.RE
+.PP
+rdma res show qp link mlx5_4
+.RS 4
+Get all QPs for the specific device.
+.RE
+.PP
+rdma res show qp link mlx5_4/1
+.RS 4
+Get QPs of specific port.
+.RE
+.PP
+rdma res show qp link mlx5_4/0
+.RS 4
+Provide illegal port number (0 is illegal).
+.RE
+.PP
+rdma res show qp link mlx5_4/-
+.RS 4
+Get QPs which have not assigned port yet.
+.RE
+.PP
+rdma res show qp link mlx5_4/- -d
+.RS 4
+Detailed view.
+.RE
+.PP
+rdma res show qp link mlx5_4/1 lqpn 0-6
+.RS 4
+Limit to specific Local QPNs.
+.RE
+.PP
+
+.SH SEE ALSO
+.BR rdma (8),
+.BR rdma-dev (8),
+.BR rdma-link (8),
+.br
+
+.SH AUTHOR
+Leon Romanovsky <leonro@mellanox.com>
-- 
2.16.1

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

* [PATCH iproute2-next 10/10] rdma: Check return value of strdup call
  2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
                   ` (5 preceding siblings ...)
  2018-01-31  8:11 ` [PATCH iproute2-next 09/10] rdma: Document resource tracking Leon Romanovsky
@ 2018-01-31  8:11 ` Leon Romanovsky
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  7 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:11 UTC (permalink / raw)
  To: David Ahern
  Cc: RDMA mailing list, Steve Wise, Leon Romanovsky, netdev,
	Stephen Hemminger, Leon Romanovsky

From: Leon Romanovsky <leonro@mellanox.com>

Fixes: 74bd75c2b68d ("rdma: Add basic infrastructure for RDMA tool")
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 rdma/utils.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/rdma/utils.c b/rdma/utils.c
index 059aa788..f9460162 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -98,6 +98,10 @@ static struct dev_map *dev_map_alloc(const char *dev_name)
 	if (!dev_map)
 		return NULL;
 	dev_map->dev_name = strdup(dev_name);
+	if (!dev_map->dev_name) {
+		free(dev_map);
+		return NULL;
+	}
 
 	return dev_map;
 }
-- 
2.16.1

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

* Re: [PATCH iproute2-next 00/10] RDMA resource tracking
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
                     ` (2 preceding siblings ...)
  2018-01-31  8:11   ` [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information Leon Romanovsky
@ 2018-01-31  8:17   ` Leon Romanovsky
  2018-02-06  1:25   ` Stephen Hemminger
  4 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-01-31  8:17 UTC (permalink / raw)
  To: David Ahern; +Cc: RDMA mailing list, Steve Wise, netdev, Stephen Hemminger

[-- Attachment #1: Type: text/plain, Size: 1542 bytes --]

On Wed, Jan 31, 2018 at 10:11:46AM +0200, Leon Romanovsky wrote:
> Changelog:
>  v2 -> v3:
>    * Rebased to commit: 1e24e773f144 ("Merge branch 'iproute2-master' into iproute2-next")
>    * Refreshed include/uapi/rdma/rdma_netlink.h file
>    * Fixed bug, where cxgb4 was printed twice.
>  v1 -> v2;
>    * Added checks for all occurrences of strdup failures and added patch
>      with fix of already merged code.
>    * Sync with latest kernel code.
>    * Rewrote table representation to be similar to "ip route" output.
>    * Implemented string filters.
>    * Removed curr/max representation from the summary output.
>  v0 -> v1:
>    * Fixed subject title in patch #1: rdam -> rdma.
>    * Added newline between variable declaration and the code.
>    * Add check to failure in strdup() call in rd_check_is_string_filtered().
>    * Rewrote res_qp_parse_cb() to avoid long lines and extra indentation.
>
> ------------------------------------------------------------------------
>
> David, Stephen,
>
> The kernel code is accepted to the RDMA and will be sent to Linus in
> this merge window, and this is refreshed version of user space part.
>
> Because, I found bug in handling cxgb4 devices and we cleaned header
> file a little bit more, it was more wise to resend the series instead
> of applying v2.
>
> https://patchwork.ozlabs.org/project/netdev/list/?series=RDMA+resource+tracking&submitter=68852&state=8&q=&archive=&delegate=
>
> Thanks

And as expected, I forgot to add version in the subject line.
Sorry for that.

Thanks

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* RE: [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information
       [not found]     ` <20180131081156.19607-9-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2018-02-01 20:05       ` Steve Wise
  2018-02-05 13:22         ` Leon Romanovsky
  0 siblings, 1 reply; 18+ messages in thread
From: Steve Wise @ 2018-02-01 20:05 UTC (permalink / raw)
  To: 'Leon Romanovsky', 'David Ahern'
  Cc: 'RDMA mailing list', 'netdev',
	'Stephen Hemminger', 'Leon Romanovsky'

Hey Leon,

> 
> From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
> 
> This patch adds ss-similar interface to view various resource
> tracked objects. At this stage, only QP is presented.
> 
> 1. Get all QPs for the specific device:
> $ rdma res show qp link mlx5_4
> link mlx5_4/- lqpn 8 type UD state RESET sq-psn 0 pid 0 comm [ib_ipoib]
> link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]
> 
> $ rdma res show qp link mlx5_4/
> link mlx5_4/- lqpn 8 type UD state RESET sq-psn 0 pid 0 comm [ib_ipoib]
> link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]
> 
> 2. Provide illegal port number (0 is illegal):
> $ rdma res show qp link mlx5_4/0
> Wrong device name
> 
> 3. Get QPs of specific port:
> $ rdma res show qp link mlx5_4/1
> link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]
> 
> 4. Get QPs which have not assigned port yet:
> link mlx5_4/- lqpn 8 type UD state RESET sq-psn 0 pid 0 comm [ib_ipoib]
> 
> 5. Limit to specific Local QPNs:
> $ rdma res show qp link mlx5_4/1 lqpn 1-3,7
> link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]
> 
> . Filter types (strings):
> $ rdma res show qp link mlx5_4/1 type UD,gSi
> link mlx5_4/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
> link mlx5_4/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
> 
> Signed-off-by: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
> ---
>  rdma/res.c   | 325
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  rdma/utils.c |  11 ++
>  2 files changed, 336 insertions(+)
> 
> diff --git a/rdma/res.c b/rdma/res.c
> index bd97c58e..2a63e712 100644
> --- a/rdma/res.c
> +++ b/rdma/res.c
> @@ -16,6 +16,9 @@ static int res_help(struct rd *rd)
>  {
>  	pr_out("Usage: %s resource\n", rd->filename);
>  	pr_out("          resource show [DEV]\n");
> +	pr_out("          resource show [qp]\n");
> +	pr_out("          resource show qp link [DEV/PORT]\n");
> +	pr_out("          resource show qp link [DEV/PORT] [FILTER-NAME
FILTER-
> VALUE]\n");
>  	return 0;
>  }
> 
> @@ -129,12 +132,334 @@ static int _res_send_msg(struct rd *rd, uint32_t
> command, mnl_cb_t callback)
>  			return rd_exec_link(rd, _##name, strict_port); \
>  	}
> 
> +static const char *path_mig_to_str(uint8_t idx)
> +{
> +	static const char * const path_mig_str[] = { "MIGRATED",
> +						     "REARM", "ARMED" };
> +
> +	if (idx < ARRAY_SIZE(path_mig_str))
> +		return path_mig_str[idx];
> +	return "UNKNOWN";
> +}
> +
> +static const char *qp_states_to_str(uint8_t idx)
> +{
> +	static const char * const qp_states_str[] = { "RESET", "INIT",
> +						      "RTR", "RTS", "SQD",
> +						      "SQE", "ERR" };
> +
> +	if (idx < ARRAY_SIZE(qp_states_str))
> +		return qp_states_str[idx];
> +	return "UNKNOWN";
> +}
> +
> +static const char *qp_types_to_str(uint8_t idx)
> +{
> +	static const char * const qp_types_str[] = { "SMI", "GSI", "RC",
> +						     "UC", "UD", "RAW_IPV6",
> +						     "RAW_ETHERTYPE",
> +						     "UNKNOWN",
> "RAW_PACKET",
> +						     "XRC_INI", "XRC_TGT" };
> +
> +	if (idx < ARRAY_SIZE(qp_types_str))
> +		return qp_types_str[idx];
> +	return "UNKNOWN";
> +}
> +
> +static void print_lqpn(struct rd *rd, uint32_t val)
> +{
> +	if (rd->json_output)
> +		jsonw_uint_field(rd->jw, "lqpn", val);
> +	else
> +		pr_out("lqpn %u ", val);
> +}
> +
> +static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr
**nla_line)
> +{
> +	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
> +		return;
> +
> +	if (rd->json_output)
> +		jsonw_uint_field(rd->jw, "rqpn", val);
> +	else
> +		pr_out("rqpn %u ", val);
> +}
> +
> +static void print_type(struct rd *rd, uint32_t val)
> +{
> +	if (rd->json_output)
> +		jsonw_string_field(rd->jw, "type",
> +				   qp_types_to_str(val));
> +	else
> +		pr_out("type %s ", qp_types_to_str(val));
> +}
> +
> +static void print_state(struct rd *rd, uint32_t val)
> +{
> +	if (rd->json_output)
> +		jsonw_string_field(rd->jw, "state",
> +				   qp_states_to_str(val));
> +	else
> +		pr_out("state %s ", qp_states_to_str(val));
> +}
> +
> +static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr
**nla_line)
> +{
> +	if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
> +		return;
> +
> +	if (rd->json_output)
> +		jsonw_uint_field(rd->jw, "rq-psn", val);
> +	else
> +		pr_out("rq-psn %u ", val);
> +}
> +
> +static void print_sqpsn(struct rd *rd, uint32_t val)
> +{
> +	if (rd->json_output)
> +		jsonw_uint_field(rd->jw, "sq-psn", val);
> +	else
> +		pr_out("sq-psn %u ", val);
> +}
> +
> +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;
> +
> +	if (rd->json_output)
> +		jsonw_string_field(rd->jw,
> +				   "path-mig-state",
> +				   path_mig_to_str(val));
> +	else
> +		pr_out("path-mig-state %s ", path_mig_to_str(val));
> +}
> +
> +static void print_pid(struct rd *rd, uint32_t val)
> +{
> +	if (rd->json_output)
> +		jsonw_uint_field(rd->jw, "pid", val);
> +	else
> +		pr_out("pid %u ", val);
> +}
> +
> +static void print_comm(struct rd *rd, const char *str,
> +		       struct nlattr **nla_line)
> +{
> +	char tmp[18];
> +
> +	if (rd->json_output) {
> +		/* Don't beatify output in JSON format */
> +		jsonw_string_field(rd->jw, "comm", str);
> +		return;
> +	}
> +
> +	if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
> +		snprintf(tmp, sizeof(tmp), "%s", str);
> +	else
> +		snprintf(tmp, sizeof(tmp), "[%s]", str);
> +
> +	pr_out("comm %s ", tmp);
> +}
> +
> +static void print_link(struct rd *rd, uint32_t idx, const char *name,
> +		       uint32_t port, struct nlattr **nla_line)
> +{
> +	if (rd->json_output) {
> +		jsonw_uint_field(rd->jw, "ifindex", idx);
> +
> +		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
> +			jsonw_uint_field(rd->jw, "port", port);
> +
> +		jsonw_string_field(rd->jw, "ifname", name);
> +	} else {
> +		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
> +			pr_out("link %s/%u ", name, port);
> +		else
> +			pr_out("link %s/- ", name);
> +	}
> +}
> +
> +static char *get_task_name(uint32_t pid)
> +{
> +	char *comm;
> +	FILE *f;
> +
> +	if (asprintf(&comm, "/proc/%d/comm", pid) < 0)
> +		return NULL;
> +
> +	f = fopen(comm, "r");
> +	free(comm);
> +	if (!f)
> +		return NULL;
> +
> +	if (fscanf(f, "%ms\n", &comm) != 1)
> +		comm = NULL;
> +
> +	fclose(f);
> +
> +	return comm;
> +}
> +
> +static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
> +{
> +	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
> +	struct nlattr *nla_table, *nla_entry;
> +	struct rd *rd = data;
> +	const char *name;
> +	uint32_t idx;
> +
> +	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
> +	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] ||
> +	    !tb[RDMA_NLDEV_ATTR_DEV_NAME] ||
> +	    !tb[RDMA_NLDEV_ATTR_RES_QP])
> +		return MNL_CB_ERROR;
> +
> +	name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
> +	idx =  mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
> +	nla_table = tb[RDMA_NLDEV_ATTR_RES_QP];
> +
> +	mnl_attr_for_each_nested(nla_entry, nla_table) {
> +		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
> +		uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn;
> +		uint8_t type, state, path_mig_state = 0;
> +		uint32_t port = 0, pid = 0;
> +		char *comm = NULL;
> +		int err;
> +
> +		err = mnl_attr_parse_nested(nla_entry, rd_attr_cb,
nla_line);
> +		if (err != MNL_CB_OK)
> +			return MNL_CB_ERROR;
> +
> +		if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] ||
> +		    !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
> +		    !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
> +		    !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
> +		    (!nla_line[RDMA_NLDEV_ATTR_RES_PID] &&
> +		     !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) {
> +			return MNL_CB_ERROR;
> +		}
> +
> +		if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
> +			port =
> mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
> +
> +		if (port != rd->port_idx)
> +			continue;
> +
> +		lqpn =
> mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
> +		if (rd_check_is_filtered(rd, "lqpn", lqpn))
> +			continue;
> +
> +		if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) {
> +			rqpn =
> mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]);
> +			if (rd_check_is_filtered(rd, "rqpn", rqpn))
> +				continue;
> +		} else {
> +			if (rd_check_is_key_exist(rd, "rqpn"))
> +				continue;
> +		}
> +
> +		if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
> +			rq_psn =
> mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
> +			if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
> +				continue;
> +		} else {
> +			if (rd_check_is_key_exist(rd, "rq-psn"))
> +				continue;
> +		}
> +
> +		sq_psn =
> mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
> +		if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
> +			continue;
> +
> +		if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
> +			path_mig_state =
> mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
> +			if (rd_check_is_string_filtered(rd,
"path-mig-state",
> path_mig_to_str(path_mig_state)))
> +				continue;
> +		} else {
> +			if (rd_check_is_key_exist(rd, "path-mig-state"))
> +				continue;
> +		}
> +
> +		type =
> mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
> +		if (rd_check_is_string_filtered(rd, "type",
> qp_types_to_str(type)))
> +			continue;
> +
> +		state =
> mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
> +		if (rd_check_is_string_filtered(rd, "state",
> qp_states_to_str(state)))
> +			continue;
> +
> +		if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) {
> +			pid =
> mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]);
> +			comm = get_task_name(pid);
> +		}
> +
> +		if (rd_check_is_filtered(rd, "pid", pid))
> +			continue;

Is comm leaked here when ATTR_RES_PID is present?


> +
> +		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
> +			/* discard const from mnl_attr_get_str */
> +			comm = (char
> *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);

And also here if the kernel ever passes up both PID and KERN_NAME (which it
isn't supposed to).


Steve.

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information
  2018-02-01 20:05       ` Steve Wise
@ 2018-02-05 13:22         ` Leon Romanovsky
       [not found]           ` <20180205132231.GD2567-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
  0 siblings, 1 reply; 18+ messages in thread
From: Leon Romanovsky @ 2018-02-05 13:22 UTC (permalink / raw)
  To: Steve Wise
  Cc: 'David Ahern', 'RDMA mailing list',
	'netdev', 'Stephen Hemminger'

[-- Attachment #1: Type: text/plain, Size: 1033 bytes --]

On Thu, Feb 01, 2018 at 02:05:08PM -0600, Steve Wise wrote:
> Hey Leon,

<...>

>
> > +static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
> > +{

<...>

> > +
> > +	mnl_attr_for_each_nested(nla_entry, nla_table) {
> > +		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
> > +		uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn;
> > +		uint8_t type, state, path_mig_state = 0;
> > +		uint32_t port = 0, pid = 0;
> > +		char *comm = NULL;

<...>

> > +
> > +		if (rd_check_is_filtered(rd, "pid", pid))
> > +			continue;
>
> Is comm leaked here when ATTR_RES_PID is present?
>
>
> > +
> > +		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
> > +			/* discard const from mnl_attr_get_str */
> > +			comm = (char
> > *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
>
> And also here if the kernel ever passes up both PID and KERN_NAME (which it
> isn't supposed to).

Yes, you are right, and the bad thing that I prepared everything to call
free() unconditionally by setting comm to be NULL.

Thanks

>
>
> Steve.
>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information
       [not found]           ` <20180205132231.GD2567-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
@ 2018-02-05 14:00             ` Leon Romanovsky
       [not found]               ` <20180205140037.GF2567-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
  0 siblings, 1 reply; 18+ messages in thread
From: Leon Romanovsky @ 2018-02-05 14:00 UTC (permalink / raw)
  To: 'David Ahern'
  Cc: Steve Wise, 'RDMA mailing list', 'Stephen Hemminger'

[-- Attachment #1: Type: text/plain, Size: 1993 bytes --]

On Mon, Feb 05, 2018 at 03:22:31PM +0200, Leon Romanovsky wrote:
> On Thu, Feb 01, 2018 at 02:05:08PM -0600, Steve Wise wrote:
> > Hey Leon,
>
> <...>
>
> >
> > > +static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
> > > +{
>
> <...>
>
> > > +
> > > +	mnl_attr_for_each_nested(nla_entry, nla_table) {
> > > +		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
> > > +		uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn;
> > > +		uint8_t type, state, path_mig_state = 0;
> > > +		uint32_t port = 0, pid = 0;
> > > +		char *comm = NULL;
>
> <...>
>
> > > +
> > > +		if (rd_check_is_filtered(rd, "pid", pid))
> > > +			continue;
> >
> > Is comm leaked here when ATTR_RES_PID is present?
> >
> >
> > > +
> > > +		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
> > > +			/* discard const from mnl_attr_get_str */
> > > +			comm = (char
> > > *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
> >
> > And also here if the kernel ever passes up both PID and KERN_NAME (which it
> > isn't supposed to).
>
> Yes, you are right, and the bad thing that I prepared everything to call
> free() unconditionally by setting comm to be NULL.

Stephen, David,

How do you want me to proceed?

The actual change is pretty minor:

diff --git a/rdma/res.c b/rdma/res.c
index 2a63e712..31d0c4a7 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -395,8 +395,10 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
 			comm = get_task_name(pid);
 		}

-		if (rd_check_is_filtered(rd, "pid", pid))
+		if (rd_check_is_filtered(rd, "pid", pid)) {
+			free(comm);
 			continue;
+		}

 		if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
 			/* discard const from mnl_attr_get_str */
@@ -420,8 +422,7 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
 		print_pid(rd, pid);
 		print_comm(rd, comm, nla_line);

-		if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
-			free(comm);
+		free(comm);

 		if (rd->json_output)
 			jsonw_end_array(rd->jw);

>
> Thanks
>
> >
> >
> > Steve.
> >



[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information
       [not found]               ` <20180205140037.GF2567-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
@ 2018-02-05 16:21                 ` David Ahern
  0 siblings, 0 replies; 18+ messages in thread
From: David Ahern @ 2018-02-05 16:21 UTC (permalink / raw)
  To: Leon Romanovsky, 'Stephen Hemminger'
  Cc: Steve Wise, 'RDMA mailing list'

On 2/5/18 7:00 AM, Leon Romanovsky wrote:
> 
> Stephen, David,
> 
> How do you want me to proceed?
> 

Since the RDMA code is in Linus' tree for 4.16, I think the patches
should go through Stephen's tree and the master branch. Stephen needs to
decide about the fixup.

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH iproute2-next 00/10] RDMA resource tracking
       [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
                     ` (3 preceding siblings ...)
  2018-01-31  8:17   ` [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
@ 2018-02-06  1:25   ` Stephen Hemminger
  2018-02-06  7:29     ` Leon Romanovsky
  4 siblings, 1 reply; 18+ messages in thread
From: Stephen Hemminger @ 2018-02-06  1:25 UTC (permalink / raw)
  To: Leon Romanovsky; +Cc: David Ahern, RDMA mailing list, Steve Wise, netdev

On Wed, 31 Jan 2018 10:11:46 +0200
Leon Romanovsky <leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> wrote:

> Changelog:
>  v2 -> v3:
>    * Rebased to commit: 1e24e773f144 ("Merge branch 'iproute2-master' into iproute2-next")
>    * Refreshed include/uapi/rdma/rdma_netlink.h file
>    * Fixed bug, where cxgb4 was printed twice.
>  v1 -> v2;
>    * Added checks for all occurrences of strdup failures and added patch
>      with fix of already merged code.
>    * Sync with latest kernel code.
>    * Rewrote table representation to be similar to "ip route" output.
>    * Implemented string filters.
>    * Removed curr/max representation from the summary output.
>  v0 -> v1:
>    * Fixed subject title in patch #1: rdam -> rdma.
>    * Added newline between variable declaration and the code.
>    * Add check to failure in strdup() call in rd_check_is_string_filtered().
>    * Rewrote res_qp_parse_cb() to avoid long lines and extra indentation.
> 
> ------------------------------------------------------------------------
> 
> David, Stephen,
> 
> The kernel code is accepted to the RDMA and will be sent to Linus in
> this merge window, and this is refreshed version of user space part.
> 
> Because, I found bug in handling cxgb4 devices and we cleaned header
> file a little bit more, it was more wise to resend the series instead
> of applying v2.
> 
> https://patchwork.ozlabs.org/project/netdev/list/?series=RDMA+resource+tracking&submitter=68852&state=8&q=&archive=&delegate=
> 
> Thanks
> 
> Cc: RDMA mailing list <linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
> Cc: Steve Wise <swise-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
> 
> [1] https://www.spinics.net/lists/linux-rdma/msg59535.html
> 
> Leon Romanovsky (10):
>   rdma: Add option to provide "-" sign for the port number
>   rdma: Make visible the number of arguments
>   rdma: Add filtering infrastructure
>   rdma: Set pointer to device name position
>   rdma: Allow external usage of compare string routine
>   rdma: Update kernel header file
>   rdma: Add resource tracking summary
>   rdma: Add QP resource tracking information
>   rdma: Document resource tracking
>   rdma: Check return value of strdup call
> 
>  include/uapi/rdma/rdma_netlink.h |  67 +++++-
>  man/man8/rdma-resource.8         |  86 +++++++
>  rdma/Makefile                    |   2 +-
>  rdma/link.c                      |   2 +-
>  rdma/rdma.c                      |   4 +-
>  rdma/rdma.h                      |  28 ++-
>  rdma/res.c                       | 486 +++++++++++++++++++++++++++++++++++++++
>  rdma/utils.c                     | 321 +++++++++++++++++++++++++-
>  8 files changed, 971 insertions(+), 25 deletions(-)
>  create mode 100644 man/man8/rdma-resource.8
>  create mode 100644 rdma/res.c
> 
> --
> 2.16.1
> 

Applied these to the master branch.
Dropped the kernel header update, picked that up through the other update process.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH iproute2-next 00/10] RDMA resource tracking
  2018-02-06  1:25   ` Stephen Hemminger
@ 2018-02-06  7:29     ` Leon Romanovsky
  0 siblings, 0 replies; 18+ messages in thread
From: Leon Romanovsky @ 2018-02-06  7:29 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: David Ahern, RDMA mailing list, Steve Wise, netdev

[-- Attachment #1: Type: text/plain, Size: 3120 bytes --]

On Mon, Feb 05, 2018 at 05:25:53PM -0800, Stephen Hemminger wrote:
> On Wed, 31 Jan 2018 10:11:46 +0200
> Leon Romanovsky <leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> wrote:
>
> > Changelog:
> >  v2 -> v3:
> >    * Rebased to commit: 1e24e773f144 ("Merge branch 'iproute2-master' into iproute2-next")
> >    * Refreshed include/uapi/rdma/rdma_netlink.h file
> >    * Fixed bug, where cxgb4 was printed twice.
> >  v1 -> v2;
> >    * Added checks for all occurrences of strdup failures and added patch
> >      with fix of already merged code.
> >    * Sync with latest kernel code.
> >    * Rewrote table representation to be similar to "ip route" output.
> >    * Implemented string filters.
> >    * Removed curr/max representation from the summary output.
> >  v0 -> v1:
> >    * Fixed subject title in patch #1: rdam -> rdma.
> >    * Added newline between variable declaration and the code.
> >    * Add check to failure in strdup() call in rd_check_is_string_filtered().
> >    * Rewrote res_qp_parse_cb() to avoid long lines and extra indentation.
> >
> > ------------------------------------------------------------------------
> >
> > David, Stephen,
> >
> > The kernel code is accepted to the RDMA and will be sent to Linus in
> > this merge window, and this is refreshed version of user space part.
> >
> > Because, I found bug in handling cxgb4 devices and we cleaned header
> > file a little bit more, it was more wise to resend the series instead
> > of applying v2.
> >
> > https://patchwork.ozlabs.org/project/netdev/list/?series=RDMA+resource+tracking&submitter=68852&state=8&q=&archive=&delegate=
> >
> > Thanks
> >
> > Cc: RDMA mailing list <linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
> > Cc: Steve Wise <swise-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
> >
> > [1] https://www.spinics.net/lists/linux-rdma/msg59535.html
> >
> > Leon Romanovsky (10):
> >   rdma: Add option to provide "-" sign for the port number
> >   rdma: Make visible the number of arguments
> >   rdma: Add filtering infrastructure
> >   rdma: Set pointer to device name position
> >   rdma: Allow external usage of compare string routine
> >   rdma: Update kernel header file
> >   rdma: Add resource tracking summary
> >   rdma: Add QP resource tracking information
> >   rdma: Document resource tracking
> >   rdma: Check return value of strdup call
> >
> >  include/uapi/rdma/rdma_netlink.h |  67 +++++-
> >  man/man8/rdma-resource.8         |  86 +++++++
> >  rdma/Makefile                    |   2 +-
> >  rdma/link.c                      |   2 +-
> >  rdma/rdma.c                      |   4 +-
> >  rdma/rdma.h                      |  28 ++-
> >  rdma/res.c                       | 486 +++++++++++++++++++++++++++++++++++++++
> >  rdma/utils.c                     | 321 +++++++++++++++++++++++++-
> >  8 files changed, 971 insertions(+), 25 deletions(-)
> >  create mode 100644 man/man8/rdma-resource.8
> >  create mode 100644 rdma/res.c
> >
> > --
> > 2.16.1
> >
>
> Applied these to the master branch.
> Dropped the kernel header update, picked that up through the other update process.

Thanks a lot

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

end of thread, other threads:[~2018-02-06  7:29 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-31  8:11 [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 01/10] rdma: Add option to provide "-" sign for the port number Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 02/10] rdma: Make visible the number of arguments Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 04/10] rdma: Set pointer to device name position Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 05/10] rdma: Allow external usage of compare string routine Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 06/10] rdma: Update kernel header file Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 09/10] rdma: Document resource tracking Leon Romanovsky
2018-01-31  8:11 ` [PATCH iproute2-next 10/10] rdma: Check return value of strdup call Leon Romanovsky
     [not found] ` <20180131081156.19607-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2018-01-31  8:11   ` [PATCH iproute2-next 03/10] rdma: Add filtering infrastructure Leon Romanovsky
2018-01-31  8:11   ` [PATCH iproute2-next 07/10] rdma: Add resource tracking summary Leon Romanovsky
2018-01-31  8:11   ` [PATCH iproute2-next 08/10] rdma: Add QP resource tracking information Leon Romanovsky
     [not found]     ` <20180131081156.19607-9-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2018-02-01 20:05       ` Steve Wise
2018-02-05 13:22         ` Leon Romanovsky
     [not found]           ` <20180205132231.GD2567-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2018-02-05 14:00             ` Leon Romanovsky
     [not found]               ` <20180205140037.GF2567-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2018-02-05 16:21                 ` David Ahern
2018-01-31  8:17   ` [PATCH iproute2-next 00/10] RDMA resource tracking Leon Romanovsky
2018-02-06  1:25   ` Stephen Hemminger
2018-02-06  7:29     ` Leon Romanovsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).