linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool
@ 2021-04-25 11:53 Leon Romanovsky
  2021-04-25 11:53 ` [PATCH iproute2-next 1/3] rdma: Update uapi headers Leon Romanovsky
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Leon Romanovsky @ 2021-04-25 11:53 UTC (permalink / raw)
  To: David Ahern
  Cc: Leon Romanovsky, Ido Kalir, linux-netdev, Mark Zhang,
	Neta Ostrovsky, RDMA mailing list

From: Leon Romanovsky <leonro@nvidia.com>

Hi,

This is the user space part of already accepted to the kernel series
that extends RDMA netlink interface to return uverbs context and SRQ
information.

The accepted kernel series can be seen here:
https://lore.kernel.org/linux-rdma/20210422133459.GA2390260@nvidia.com/

Thanks

Neta Ostrovsky (2):
  rdma: Update uapi headers
  rdma: Add context resource tracking information
  rdma: Add SRQ resource tracking information

 man/man8/rdma-resource.8              |  12 +-
 rdma/Makefile                         |   2 +-
 rdma/include/uapi/rdma/rdma_netlink.h |  13 ++
 rdma/res-ctx.c                        | 103 ++++++++++
 rdma/res-srq.c                        | 274 ++++++++++++++++++++++++++
 rdma/res.c                            |   8 +-
 rdma/res.h                            |  28 +++
 rdma/utils.c                          |   8 +
 8 files changed, 445 insertions(+), 3 deletions(-)
 create mode 100644 rdma/res-ctx.c
 create mode 100644 rdma/res-srq.c

-- 
2.30.2


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

* [PATCH iproute2-next 1/3] rdma: Update uapi headers
  2021-04-25 11:53 [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool Leon Romanovsky
@ 2021-04-25 11:53 ` Leon Romanovsky
  2021-04-25 11:53 ` [PATCH iproute2-next 2/3] rdma: Add context resource tracking information Leon Romanovsky
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Leon Romanovsky @ 2021-04-25 11:53 UTC (permalink / raw)
  To: David Ahern
  Cc: Neta Ostrovsky, Ido Kalir, linux-netdev, Mark Zhang, RDMA mailing list

From: Neta Ostrovsky <netao@nvidia.com>

Update rdma_netlink.h file upto kernel commit c6c11ad3ab9f
("RDMA/nldev: Add QP numbers to SRQ information")

Reviewed-by: Mark Zhang <markz@mellanox.com>
Signed-off-by: Neta Ostrovsky <netao@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
---
 rdma/include/uapi/rdma/rdma_netlink.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h
index 4aef76ae..e161c245 100644
--- a/rdma/include/uapi/rdma/rdma_netlink.h
+++ b/rdma/include/uapi/rdma/rdma_netlink.h
@@ -293,6 +293,10 @@ enum rdma_nldev_command {
 
 	RDMA_NLDEV_CMD_RES_MR_GET_RAW,
 
+	RDMA_NLDEV_CMD_RES_CTX_GET, /* can dump */
+
+	RDMA_NLDEV_CMD_RES_SRQ_GET, /* can dump */
+
 	RDMA_NLDEV_NUM_OPS
 };
 
@@ -533,6 +537,15 @@ enum rdma_nldev_attr {
 
 	RDMA_NLDEV_ATTR_RES_RAW,	/* binary */
 
+	RDMA_NLDEV_ATTR_RES_CTX,		/* nested table */
+	RDMA_NLDEV_ATTR_RES_CTX_ENTRY,		/* nested table */
+
+	RDMA_NLDEV_ATTR_RES_SRQ,		/* nested table */
+	RDMA_NLDEV_ATTR_RES_SRQ_ENTRY,		/* nested table */
+	RDMA_NLDEV_ATTR_RES_SRQN,		/* u32 */
+
+	RDMA_NLDEV_ATTR_MIN_RANGE,		/* u32 */
+	RDMA_NLDEV_ATTR_MAX_RANGE,		/* u32 */
 	/*
 	 * Always the end
 	 */
-- 
2.30.2


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

* [PATCH iproute2-next 2/3] rdma: Add context resource tracking information
  2021-04-25 11:53 [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool Leon Romanovsky
  2021-04-25 11:53 ` [PATCH iproute2-next 1/3] rdma: Update uapi headers Leon Romanovsky
@ 2021-04-25 11:53 ` Leon Romanovsky
  2021-04-25 11:53 ` [PATCH iproute2-next 3/3] rdma: Add SRQ " Leon Romanovsky
  2021-04-28 15:38 ` [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool David Ahern
  3 siblings, 0 replies; 8+ messages in thread
From: Leon Romanovsky @ 2021-04-25 11:53 UTC (permalink / raw)
  To: David Ahern
  Cc: Neta Ostrovsky, Ido Kalir, linux-netdev, Mark Zhang, RDMA mailing list

From: Neta Ostrovsky <netao@nvidia.com>

Sample output:

$ rdma res show ctx
dev ibp8s0f0 ctxn 0 pid 980 comm ibv_rc_pingpong
dev ibp8s0f0 ctxn 1 pid 981 comm ibv_rc_pingpong
dev ibp8s0f0 ctxn 2 pid 992 comm ibv_rc_pingpong
dev ibp8s0f1 ctxn 0 pid 984 comm ibv_rc_pingpong
dev ibp8s0f1 ctxn 1 pid 987 comm ibv_rc_pingpong

$ rdma res show ctx dev ibp8s0f1
dev ibp8s0f1 ctxn 0 pid 984 comm ibv_rc_pingpong
dev ibp8s0f1 ctxn 1 pid 987 comm ibv_rc_pingpong

Reviewed-by: Mark Zhang <markz@mellanox.com>
Reviewed-by: Ido Kalir <idok@nvidia.com>
Signed-off-by: Neta Ostrovsky <netao@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
---
 man/man8/rdma-resource.8 |   7 ++-
 rdma/Makefile            |   2 +-
 rdma/res-ctx.c           | 103 +++++++++++++++++++++++++++++++++++++++
 rdma/res.c               |   5 +-
 rdma/res.h               |  12 +++++
 rdma/utils.c             |   3 ++
 6 files changed, 129 insertions(+), 3 deletions(-)
 create mode 100644 rdma/res-ctx.c

diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8
index 8d0d14c6..c2102853 100644
--- a/man/man8/rdma-resource.8
+++ b/man/man8/rdma-resource.8
@@ -13,7 +13,7 @@ rdma-resource \- rdma resource configuration
 
 .ti -8
 .IR RESOURCE " := { "
-.BR cm_id " | " cq " | " mr " | " pd " | " qp " }"
+.BR cm_id " | " cq " | " mr " | " pd " | " qp " | " ctx " }"
 .sp
 
 .ti -8
@@ -103,6 +103,11 @@ rdma resource show cq pid 30489
 Show CQs belonging to pid 30489
 .RE
 .PP
+rdma resource show ctx ctxn 1
+.RS 4
+Show contexts that have index equal to 1.
+.RE
+.PP
 
 .SH SEE ALSO
 .BR rdma (8),
diff --git a/rdma/Makefile b/rdma/Makefile
index aa5ce822..32f504fc 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -7,7 +7,7 @@ ifeq ($(HAVE_MNL),y)
 CFLAGS += -I./include/uapi/
 
 RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \
-	   res-cmid.o res-qp.o sys.o stat.o stat-mr.o
+	   res-cmid.o res-qp.o sys.o stat.o stat-mr.o res-ctx.o
 
 TARGETS += rdma
 endif
diff --git a/rdma/res-ctx.c b/rdma/res-ctx.c
new file mode 100644
index 00000000..30afe97a
--- /dev/null
+++ b/rdma/res-ctx.c
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-ctx.c	RDMA tool
+ * Authors:     Neta Ostrovsky <netao@nvidia.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+static int res_ctx_line(struct rd *rd, const char *name, int idx,
+			struct nlattr **nla_line)
+{
+	char *comm = NULL;
+	uint32_t ctxn = 0;
+	uint32_t pid = 0;
+
+	if (!nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+		return MNL_CB_ERROR;
+
+	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_is_filtered_attr(rd, "pid", pid,
+				nla_line[RDMA_NLDEV_ATTR_RES_PID]))
+		goto out;
+
+	if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+		ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+
+	if (rd_is_filtered_attr(rd, "ctxn", ctxn,
+				nla_line[RDMA_NLDEV_ATTR_RES_CTXN]))
+		goto out;
+
+	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]);
+
+	open_json_object(NULL);
+	print_dev(rd, idx, name);
+	res_print_uint(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+	res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(rd, comm, nla_line);
+
+	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
+	newline(rd);
+
+out:
+	if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+		free(comm);
+	return MNL_CB_OK;
+}
+
+int res_ctx_idx_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])
+		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]);
+
+	return res_ctx_line(rd, name, idx, tb);
+}
+
+int res_ctx_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;
+	int ret = MNL_CB_OK;
+	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_CTX])
+		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_CTX];
+
+	mnl_attr_for_each_nested(nla_entry, nla_table) {
+		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+
+		ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
+		if (ret != MNL_CB_OK)
+			break;
+
+		ret = res_ctx_line(rd, name, idx, nla_line);
+		if (ret != MNL_CB_OK)
+			break;
+	}
+	return ret;
+}
diff --git a/rdma/res.c b/rdma/res.c
index f42ae938..dbc3179e 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -11,7 +11,7 @@ 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|cm_id|pd|mr|cq]\n");
+	pr_out("          resource show [qp|cm_id|pd|mr|cq|ctx]\n");
 	pr_out("          resource show qp link [DEV/PORT]\n");
 	pr_out("          resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
 	pr_out("          resource show cm_id link [DEV/PORT]\n");
@@ -22,6 +22,8 @@ static int res_help(struct rd *rd)
 	pr_out("          resource show pd dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
 	pr_out("          resource show mr dev [DEV]\n");
 	pr_out("          resource show mr dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
+	pr_out("          resource show ctx dev [DEV]\n");
+	pr_out("          resource show ctx dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
 	return 0;
 }
 
@@ -224,6 +226,7 @@ static int res_show(struct rd *rd)
 		{ "cq",		res_cq		},
 		{ "mr",		res_mr		},
 		{ "pd",		res_pd		},
+		{ "ctx",	res_ctx		},
 		{ 0 }
 	};
 
diff --git a/rdma/res.h b/rdma/res.h
index e8bd02e4..a8093d15 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -22,6 +22,8 @@ int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data);
 int res_cm_id_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
 int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data);
 int res_qp_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_ctx_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_ctx_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
 
 static inline uint32_t res_get_command(uint32_t command, struct rd *rd)
 {
@@ -155,6 +157,16 @@ filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {
 RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false,
 	 RDMA_NLDEV_ATTR_RES_LQPN);
 
+static const
+struct filters ctx_valid_filters[MAX_NUMBER_OF_FILTERS] = {
+	{ .name = "dev", .is_number = false },
+	{ .name = "pid", .is_number = true },
+	{ .name = "ctxn", .is_number = true, .is_doit = true },
+};
+
+RES_FUNC(res_ctx, RDMA_NLDEV_CMD_RES_CTX_GET, ctx_valid_filters, true,
+	 RDMA_NLDEV_ATTR_RES_CTXN);
+
 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);
diff --git a/rdma/utils.c b/rdma/utils.c
index 292e1808..e2c9bb6f 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -435,6 +435,9 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_RES_LKEY] = MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_RES_IOVA] = MNL_TYPE_U64,
 	[RDMA_NLDEV_ATTR_RES_MRLEN] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_RES_CTX] = MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_CTX_ENTRY] = MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_CTXN] = MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_NDEV_INDEX]		= MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_NDEV_NAME]		= MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_DRIVER] = MNL_TYPE_NESTED,
-- 
2.30.2


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

* [PATCH iproute2-next 3/3] rdma: Add SRQ resource tracking information
  2021-04-25 11:53 [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool Leon Romanovsky
  2021-04-25 11:53 ` [PATCH iproute2-next 1/3] rdma: Update uapi headers Leon Romanovsky
  2021-04-25 11:53 ` [PATCH iproute2-next 2/3] rdma: Add context resource tracking information Leon Romanovsky
@ 2021-04-25 11:53 ` Leon Romanovsky
  2021-04-28 15:38 ` [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool David Ahern
  3 siblings, 0 replies; 8+ messages in thread
From: Leon Romanovsky @ 2021-04-25 11:53 UTC (permalink / raw)
  To: David Ahern
  Cc: Neta Ostrovsky, Ido Kalir, linux-netdev, Mark Zhang, RDMA mailing list

From: Neta Ostrovsky <netao@nvidia.com>

Sample output:

$ rdma res show srq
dev ibp8s0f0 srqn 0 type BASIC pdn 3 comm [ib_ipoib]
dev ibp8s0f0 srqn 4 type BASIC lqpn 125-128,130-140 pdn 9 pid 3581 comm ibv_srq_pingpon
dev ibp8s0f0 srqn 5 type BASIC lqpn 141-156 pdn 10 pid 3584 comm ibv_srq_pingpon
dev ibp8s0f0 srqn 6 type BASIC lqpn 157-172 pdn 11 pid 3590 comm ibv_srq_pingpon
dev ibp8s0f1 srqn 0 type BASIC pdn 3 comm [ib_ipoib]
dev ibp8s0f1 srqn 1 type BASIC lqpn 329-344 pdn 4 pid 3586 comm ibv_srq_pingpon

$ rdma res show srq lqpn 126-141
dev ibp8s0f0 srqn 4 type BASIC lqpn 126-128,130-140 pdn 9 pid 3581 comm ibv_srq_pingpon
dev ibp8s0f0 srqn 5 type BASIC lqpn 141 pdn 10 pid 3584 comm ibv_srq_pingpon

$ rdma res show srq lqpn 127
dev ibp8s0f0 srqn 4 type BASIC lqpn 127 pdn 9 pid 3581 comm ibv_srq_pingpon

Reviewed-by: Ido Kalir <idok@nvidia.com>
Reviewed-by: Mark Zhang <markz@mellanox.com>
Signed-off-by: Neta Ostrovsky <netao@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
---
 man/man8/rdma-resource.8 |   7 +-
 rdma/Makefile            |   2 +-
 rdma/res-srq.c           | 274 +++++++++++++++++++++++++++++++++++++++
 rdma/res.c               |   5 +-
 rdma/res.h               |  16 +++
 rdma/utils.c             |   5 +
 6 files changed, 306 insertions(+), 3 deletions(-)
 create mode 100644 rdma/res-srq.c

diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8
index c2102853..1035478d 100644
--- a/man/man8/rdma-resource.8
+++ b/man/man8/rdma-resource.8
@@ -13,7 +13,7 @@ rdma-resource \- rdma resource configuration
 
 .ti -8
 .IR RESOURCE " := { "
-.BR cm_id " | " cq " | " mr " | " pd " | " qp " | " ctx " }"
+.BR cm_id " | " cq " | " mr " | " pd " | " qp " | " ctx " | " srq " }"
 .sp
 
 .ti -8
@@ -108,6 +108,11 @@ rdma resource show ctx ctxn 1
 Show contexts that have index equal to 1.
 .RE
 .PP
+rdma resource show srq lqpn 5-7
+.RS 4
+Show SRQs that the QPs with lqpn 5-7 are associated with.
+.RE
+.PP
 
 .SH SEE ALSO
 .BR rdma (8),
diff --git a/rdma/Makefile b/rdma/Makefile
index 32f504fc..9154efeb 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -7,7 +7,7 @@ ifeq ($(HAVE_MNL),y)
 CFLAGS += -I./include/uapi/
 
 RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \
-	   res-cmid.o res-qp.o sys.o stat.o stat-mr.o res-ctx.o
+	   res-cmid.o res-qp.o sys.o stat.o stat-mr.o res-ctx.o res-srq.o
 
 TARGETS += rdma
 endif
diff --git a/rdma/res-srq.c b/rdma/res-srq.c
new file mode 100644
index 00000000..c14ac5d8
--- /dev/null
+++ b/rdma/res-srq.c
@@ -0,0 +1,274 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-srq.c	RDMA tool
+ * Authors:     Neta Ostrovsky <netao@nvidia.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+#define MAX_QP_STR_LEN 256
+
+static const char *srq_types_to_str(uint8_t idx)
+{
+	static const char *const srq_types_str[] = { "BASIC",
+						     "XRC",
+						     "TM" };
+
+	if (idx < ARRAY_SIZE(srq_types_str))
+		return srq_types_str[idx];
+	return "UNKNOWN";
+}
+
+static void print_type(struct rd *rd, uint32_t val)
+{
+	print_color_string(PRINT_ANY, COLOR_NONE, "type", "type %s ",
+			   srq_types_to_str(val));
+}
+
+static void print_qps(const char *str)
+{
+	if (!strlen(str))
+		return;
+	print_color_string(PRINT_ANY, COLOR_NONE, "lqpn", "lqpn %s ", str);
+}
+
+static int filter_srq_range_qps(struct rd *rd, struct nlattr **qp_line,
+				uint32_t min_range, uint32_t max_range,
+				char **delimiter, char *qp_str)
+{
+	uint32_t qpn = 0, tmp_min_range = 0, tmp_max_range = 0;
+	char tmp[16] = {};
+
+	for (qpn = min_range; qpn <= max_range; qpn++) {
+		if (rd_is_filtered_attr(rd, "lqpn", qpn,
+				qp_line[RDMA_NLDEV_ATTR_MIN_RANGE])) {
+			/* The QPs range contains a LQPN that is filtered */
+			if (!tmp_min_range)
+				/* There are no QPs previous to
+				 * the filtered one
+				 */
+				continue;
+			if (!tmp_max_range)
+				snprintf(tmp, sizeof(tmp), "%s%d", *delimiter,
+					 tmp_min_range);
+			else
+				snprintf(tmp, sizeof(tmp), "%s%d-%d",
+					 *delimiter, tmp_min_range,
+					 tmp_max_range);
+
+			if (strlen(qp_str) + strlen(tmp) >= MAX_QP_STR_LEN)
+				return -EINVAL;
+			strncat(qp_str, tmp, sizeof(tmp) - 1);
+
+			memset(tmp, 0, strlen(tmp));
+			*delimiter = ",";
+			tmp_min_range = 0;
+			tmp_max_range = 0;
+			continue;
+		}
+		if (!tmp_min_range)
+			tmp_min_range = qpn;
+		else
+			tmp_max_range = qpn;
+	}
+
+	if (!tmp_min_range)
+		return 0;
+	if (!tmp_max_range)
+		snprintf(tmp, sizeof(tmp), "%s%d", *delimiter, tmp_min_range);
+	else
+		snprintf(tmp, sizeof(tmp), "%s%d-%d", *delimiter,
+			 tmp_min_range, tmp_max_range);
+
+	if (strlen(qp_str) + strlen(tmp) >= MAX_QP_STR_LEN)
+		return -EINVAL;
+	strncat(qp_str, tmp, sizeof(tmp) - 1);
+	*delimiter = ",";
+	return 0;
+}
+
+static int get_srq_qps(struct rd *rd, struct nlattr *qp_table,  char *qp_str)
+{
+	uint32_t qpn = 0, min_range = 0, max_range = 0;
+	struct nlattr *nla_entry;
+	struct filter_entry *fe;
+	char *delimiter = "";
+	char tmp[16] = {};
+
+	if (!qp_table)
+		return MNL_CB_ERROR;
+
+	/* If there are no QPs associated with the SRQ, return */
+	if (!(mnl_attr_get_payload_len(qp_table))) {
+		list_for_each_entry(fe, &rd->filter_list, list) {
+			if (!strcmpx(fe->key, "lqpn"))
+				/* We found the key -
+				 * user requested to filter by LQPN
+				 */
+				return -EINVAL;
+		}
+		return MNL_CB_OK;
+	}
+
+	mnl_attr_for_each_nested(nla_entry, qp_table) {
+		struct nlattr *qp_line[RDMA_NLDEV_ATTR_MAX] = {};
+
+		if (mnl_attr_parse_nested(nla_entry, rd_attr_cb, qp_line) !=
+		    MNL_CB_OK)
+			goto out;
+
+		if (qp_line[RDMA_NLDEV_ATTR_RES_LQPN]) {
+			qpn = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+			if (rd_is_filtered_attr(rd, "lqpn", qpn,
+					qp_line[RDMA_NLDEV_ATTR_RES_LQPN]))
+				continue;
+			snprintf(tmp, sizeof(tmp), "%s%d", delimiter, qpn);
+			if (strlen(qp_str) + strlen(tmp) >= MAX_QP_STR_LEN)
+				goto out;
+			strncat(qp_str, tmp, sizeof(tmp) - 1);
+			delimiter = ",";
+		} else if (qp_line[RDMA_NLDEV_ATTR_MIN_RANGE] &&
+			   qp_line[RDMA_NLDEV_ATTR_MAX_RANGE]) {
+			min_range = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_MIN_RANGE]);
+			max_range = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_MAX_RANGE]);
+
+			if (filter_srq_range_qps(rd, qp_line, min_range,
+						 max_range, &delimiter,
+						 qp_str))
+				goto out;
+		} else {
+			goto out;
+		}
+	}
+
+	if (!strlen(qp_str))
+		/* Check if there are no QPs to display after filter */
+		goto out;
+
+	return MNL_CB_OK;
+
+out:
+	memset(qp_str, 0, strlen(qp_str));
+	return -EINVAL;
+}
+
+static int res_srq_line(struct rd *rd, const char *name, int idx,
+			struct nlattr **nla_line)
+{
+	uint32_t srqn = 0, pid = 0, pdn = 0, cqn = 0;
+	char qp_str[MAX_QP_STR_LEN] = {};
+	char *comm = NULL;
+	uint8_t type = 0;
+
+	if (!nla_line[RDMA_NLDEV_ATTR_RES_SRQN])
+		return MNL_CB_ERROR;
+
+	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_is_filtered_attr(rd, "pid", pid,
+				nla_line[RDMA_NLDEV_ATTR_RES_PID]))
+		goto out;
+
+	if (nla_line[RDMA_NLDEV_ATTR_RES_SRQN])
+		srqn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SRQN]);
+	if (rd_is_filtered_attr(rd, "srqn", srqn,
+				nla_line[RDMA_NLDEV_ATTR_RES_SRQN]))
+		goto out;
+
+	if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
+		type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
+	if (rd_is_string_filtered_attr(rd, "type", srq_types_to_str(type),
+				       nla_line[RDMA_NLDEV_ATTR_RES_TYPE]))
+		goto out;
+
+	if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
+		pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
+	if (rd_is_filtered_attr(rd, "pdn", pdn,
+				nla_line[RDMA_NLDEV_ATTR_RES_PDN]))
+		goto out;
+
+	if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
+		cqn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+	if (rd_is_filtered_attr(rd, "cqn", cqn,
+				nla_line[RDMA_NLDEV_ATTR_RES_CQN]))
+		goto out;
+
+	if (get_srq_qps(rd, nla_line[RDMA_NLDEV_ATTR_RES_QP], qp_str) !=
+			MNL_CB_OK)
+		goto out;
+
+	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]);
+
+	open_json_object(NULL);
+	print_dev(rd, idx, name);
+	res_print_uint(rd, "srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]);
+	print_type(rd, type);
+	print_qps(qp_str);
+	res_print_uint(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]);
+	res_print_uint(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+	res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+	print_comm(rd, comm, nla_line);
+
+	print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
+	newline(rd);
+
+out:
+	if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+		free(comm);
+	return MNL_CB_OK;
+}
+
+int res_srq_idx_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])
+		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]);
+
+	return res_srq_line(rd, name, idx, tb);
+}
+
+int res_srq_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;
+	int ret = MNL_CB_OK;
+	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_SRQ])
+		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_SRQ];
+
+	mnl_attr_for_each_nested(nla_entry, nla_table) {
+		struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+
+		ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
+		if (ret != MNL_CB_OK)
+			break;
+
+		ret = res_srq_line(rd, name, idx, nla_line);
+		if (ret != MNL_CB_OK)
+			break;
+	}
+	return ret;
+}
diff --git a/rdma/res.c b/rdma/res.c
index dbc3179e..9aae5d4b 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -11,7 +11,7 @@ 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|cm_id|pd|mr|cq|ctx]\n");
+	pr_out("          resource show [qp|cm_id|pd|mr|cq|ctx|srq]\n");
 	pr_out("          resource show qp link [DEV/PORT]\n");
 	pr_out("          resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
 	pr_out("          resource show cm_id link [DEV/PORT]\n");
@@ -24,6 +24,8 @@ static int res_help(struct rd *rd)
 	pr_out("          resource show mr dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
 	pr_out("          resource show ctx dev [DEV]\n");
 	pr_out("          resource show ctx dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
+	pr_out("          resource show srq dev [DEV]\n");
+	pr_out("          resource show srq dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
 	return 0;
 }
 
@@ -227,6 +229,7 @@ static int res_show(struct rd *rd)
 		{ "mr",		res_mr		},
 		{ "pd",		res_pd		},
 		{ "ctx",	res_ctx		},
+		{ "srq",	res_srq		},
 		{ 0 }
 	};
 
diff --git a/rdma/res.h b/rdma/res.h
index a8093d15..58fa6ad1 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -24,6 +24,8 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data);
 int res_qp_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
 int res_ctx_parse_cb(const struct nlmsghdr *nlh, void *data);
 int res_ctx_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_srq_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_srq_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
 
 static inline uint32_t res_get_command(uint32_t command, struct rd *rd)
 {
@@ -167,6 +169,20 @@ struct filters ctx_valid_filters[MAX_NUMBER_OF_FILTERS] = {
 RES_FUNC(res_ctx, RDMA_NLDEV_CMD_RES_CTX_GET, ctx_valid_filters, true,
 	 RDMA_NLDEV_ATTR_RES_CTXN);
 
+static const
+struct filters srq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
+	{ .name = "dev", .is_number = false },
+	{ .name = "pid", .is_number = true },
+	{ .name = "srqn", .is_number = true, .is_doit = true },
+	{ .name = "type", .is_number = false },
+	{ .name = "pdn", .is_number = true },
+	{ .name = "cqn", .is_number = true },
+	{ .name = "lqpn", .is_number = true },
+};
+
+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);
diff --git a/rdma/utils.c b/rdma/utils.c
index e2c9bb6f..21177b56 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -438,6 +438,11 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_RES_CTX] = MNL_TYPE_NESTED,
 	[RDMA_NLDEV_ATTR_RES_CTX_ENTRY] = MNL_TYPE_NESTED,
 	[RDMA_NLDEV_ATTR_RES_CTXN] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_RES_SRQ] = MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_SRQ_ENTRY] = MNL_TYPE_NESTED,
+	[RDMA_NLDEV_ATTR_RES_SRQN] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_MIN_RANGE] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_MAX_RANGE] = MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_NDEV_INDEX]		= MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_NDEV_NAME]		= MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_DRIVER] = MNL_TYPE_NESTED,
-- 
2.30.2


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

* Re: [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool
  2021-04-25 11:53 [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool Leon Romanovsky
                   ` (2 preceding siblings ...)
  2021-04-25 11:53 ` [PATCH iproute2-next 3/3] rdma: Add SRQ " Leon Romanovsky
@ 2021-04-28 15:38 ` David Ahern
  3 siblings, 0 replies; 8+ messages in thread
From: David Ahern @ 2021-04-28 15:38 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Leon Romanovsky, Ido Kalir, linux-netdev, Mark Zhang,
	Neta Ostrovsky, RDMA mailing list

On 4/25/21 5:53 AM, Leon Romanovsky wrote:
> From: Leon Romanovsky <leonro@nvidia.com>
> 
> Hi,
> 
> This is the user space part of already accepted to the kernel series
> that extends RDMA netlink interface to return uverbs context and SRQ
> information.
> 
> The accepted kernel series can be seen here:
> https://lore.kernel.org/linux-rdma/20210422133459.GA2390260@nvidia.com/
> 
> Thanks
> 
> Neta Ostrovsky (2):
>   rdma: Update uapi headers
>   rdma: Add context resource tracking information
>   rdma: Add SRQ resource tracking information
> 
>  man/man8/rdma-resource.8              |  12 +-
>  rdma/Makefile                         |   2 +-
>  rdma/include/uapi/rdma/rdma_netlink.h |  13 ++
>  rdma/res-ctx.c                        | 103 ++++++++++
>  rdma/res-srq.c                        | 274 ++++++++++++++++++++++++++
>  rdma/res.c                            |   8 +-
>  rdma/res.h                            |  28 +++
>  rdma/utils.c                          |   8 +
>  8 files changed, 445 insertions(+), 3 deletions(-)
>  create mode 100644 rdma/res-ctx.c
>  create mode 100644 rdma/res-srq.c
> 

applied to iproute2-next.

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

* [PATCH iproute2-next 1/3] rdma: update uapi headers
  2023-10-19  8:21 [PATCH iproute2-next 0/3] Add support to set privileged qkey parameter Patrisious Haddad
@ 2023-10-19  8:21 ` Patrisious Haddad
  0 siblings, 0 replies; 8+ messages in thread
From: Patrisious Haddad @ 2023-10-19  8:21 UTC (permalink / raw)
  To: jgg, leon, dsahern, stephen
  Cc: Patrisious Haddad, netdev, linux-rdma, linuxarm, linux-kernel,
	huangjunxian6, michaelgur

Update rdma_netlink.h file upto kernel commit 36ce80759f8c
("RDMA/core: Add support to set privileged qkey parameter")

Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
---
 rdma/include/uapi/rdma/rdma_netlink.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h
index 92c528a0..3a506efa 100644
--- a/rdma/include/uapi/rdma/rdma_netlink.h
+++ b/rdma/include/uapi/rdma/rdma_netlink.h
@@ -554,6 +554,12 @@ enum rdma_nldev_attr {
 	RDMA_NLDEV_ATTR_STAT_HWCOUNTER_INDEX,	/* u32 */
 	RDMA_NLDEV_ATTR_STAT_HWCOUNTER_DYNAMIC, /* u8 */
 
+	/*
+	 * To enable or disable using privileged_qkey without being
+	 * a privileged user.
+	 */
+	RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE,	/* u8 */
+
 	/*
 	 * Always the end
 	 */
-- 
2.18.1


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

* [PATCH iproute2-next 1/3] rdma: Update uapi headers
  2021-09-21  6:27 [PATCH iproute2-next 0/3] Optional counter statistics support Mark Zhang
@ 2021-09-21  6:27 ` Mark Zhang
  0 siblings, 0 replies; 8+ messages in thread
From: Mark Zhang @ 2021-09-21  6:27 UTC (permalink / raw)
  To: jgg, dledford; +Cc: linux-rdma, aharonl, netao, leonro, Mark Zhang

From: Neta Ostrovsky <netao@nvidia.com>

Update rdma_netlink.h file upto kernel commit

Signed-off-by: Neta Ostrovsky <netao@nvidia.com>
Signed-off-by: Mark Zhang <markzhang@nvidia.com>
---
 rdma/include/uapi/rdma/rdma_netlink.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h
index 37f583ee..fd347bc7 100644
--- a/rdma/include/uapi/rdma/rdma_netlink.h
+++ b/rdma/include/uapi/rdma/rdma_netlink.h
@@ -549,6 +549,9 @@ enum rdma_nldev_attr {
 
 	RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK,	/* u8 */
 
+	RDMA_NLDEV_ATTR_STAT_HWCOUNTER_INDEX,	/* u32 */
+	RDMA_NLDEV_ATTR_STAT_HWCOUNTER_DYNAMIC, /* u8 0 - disabled, 1 - enabled */
+
 	/*
 	 * Always the end
 	 */
-- 
2.26.2


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

* [PATCH iproute2-next 1/3] rdma: update uapi headers
  2020-08-04  8:49 [PATCH iproute2-next 0/3] Global per-type support for QP counters Leon Romanovsky
@ 2020-08-04  8:49 ` Leon Romanovsky
  0 siblings, 0 replies; 8+ messages in thread
From: Leon Romanovsky @ 2020-08-04  8:49 UTC (permalink / raw)
  To: David Ahern
  Cc: Mark Zhang, Doug Ledford, Ido Kalir, Jason Gunthorpe,
	linux-netdev, RDMA mailing list

From: Mark Zhang <markz@mellanox.com>

Update rdma_netlink.h file upto kernel commit 76251e15ea73
("RDMA/counter: Add PID category support in auto mode")

Signed-off-by: Mark Zhang <markz@mellanox.com>
Reviewed-by: Ido Kalir <idok@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 rdma/include/uapi/rdma/rdma_netlink.h | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h
index fe127b88..4aef76ae 100644
--- a/rdma/include/uapi/rdma/rdma_netlink.h
+++ b/rdma/include/uapi/rdma/rdma_netlink.h
@@ -287,11 +287,11 @@ enum rdma_nldev_command {
 
 	RDMA_NLDEV_CMD_STAT_DEL,
 
-	RDMA_NLDEV_CMD_RES_QP_GET_RAW, /* can dump */
+	RDMA_NLDEV_CMD_RES_QP_GET_RAW,
 
-	RDMA_NLDEV_CMD_RES_CQ_GET_RAW, /* can dump */
+	RDMA_NLDEV_CMD_RES_CQ_GET_RAW,
 
-	RDMA_NLDEV_CMD_RES_MR_GET_RAW, /* can dump */
+	RDMA_NLDEV_CMD_RES_MR_GET_RAW,
 
 	RDMA_NLDEV_NUM_OPS
 };
@@ -531,7 +531,7 @@ enum rdma_nldev_attr {
 	 */
 	RDMA_NLDEV_ATTR_DEV_DIM,                /* u8 */
 
-	RDMA_NLDEV_ATTR_RES_RAW,                /* binary */
+	RDMA_NLDEV_ATTR_RES_RAW,	/* binary */
 
 	/*
 	 * Always the end
@@ -569,5 +569,6 @@ enum rdma_nl_counter_mode {
  */
 enum rdma_nl_counter_mask {
 	RDMA_COUNTER_MASK_QP_TYPE = 1,
+	RDMA_COUNTER_MASK_PID = 1 << 1,
 };
 #endif /* _RDMA_NETLINK_H */
-- 
2.26.2


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

end of thread, other threads:[~2023-10-19  8:22 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-25 11:53 [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool Leon Romanovsky
2021-04-25 11:53 ` [PATCH iproute2-next 1/3] rdma: Update uapi headers Leon Romanovsky
2021-04-25 11:53 ` [PATCH iproute2-next 2/3] rdma: Add context resource tracking information Leon Romanovsky
2021-04-25 11:53 ` [PATCH iproute2-next 3/3] rdma: Add SRQ " Leon Romanovsky
2021-04-28 15:38 ` [PATCH iproute2-next 0/3] Add context and SRQ information to rdmatool David Ahern
  -- strict thread matches above, loose matches on Subject: below --
2023-10-19  8:21 [PATCH iproute2-next 0/3] Add support to set privileged qkey parameter Patrisious Haddad
2023-10-19  8:21 ` [PATCH iproute2-next 1/3] rdma: update uapi headers Patrisious Haddad
2021-09-21  6:27 [PATCH iproute2-next 0/3] Optional counter statistics support Mark Zhang
2021-09-21  6:27 ` [PATCH iproute2-next 1/3] rdma: Update uapi headers Mark Zhang
2020-08-04  8:49 [PATCH iproute2-next 0/3] Global per-type support for QP counters Leon Romanovsky
2020-08-04  8:49 ` [PATCH iproute2-next 1/3] rdma: update uapi headers 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).