Skip to contentSkip to conversation

RDMAtool

PATCH Superseded Leon Romanovsky 3 participants 9 messages Jun 27, 2017 – Jun 28, 2017 2 messages not in the archive

Subsystems (4)

v1 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

cover RDMAtool

From: Leon Romanovsky <[email protected]>

Hi,

This is second version of series implementing the RDAMtool - the tool to configure RDMA devices. The initial proposal was sent as RFC [1] and was based on sysfs entries as POC.

The current series was rewritten completely to work with RDMA netlinks as a source of user<->kernel communications. In order to achieve that, the RDMA netlinks were extensively refactored and modernized [2, 3, 4 and 5].

Changelog
v0->v1:
* Moved hunk with changes in man/Makefile from first patch to the last patch
* Removed the "unknown command" from the examples in commit messages
* Removed special "caps" parsing command and put it to be part of general "show" command
* Changed parsed capability format to be similar to iproute2 suite
* Added FW version as an output of show command.
* Added forgotten CAP_FLAGS to the nla_policy list
RFC->v0:
* Removed everything that is not implemented yet.
* Abandoned sysfs interfaces in favor of netlink.

Available in the "topic/rdmatool-netlink-v1" topic branch of this git repo:
git://git.kernel.org/pub/scm/linux/kernel/git/leon/iproute2.git

Or for browsing:
https://git.kernel.org/cgit/linux/kernel/git/leon/iproute2.git/log/?h=topic/rdmatool-netlink-v1

Thanks

[1] https://www.spinics.net/lists/linux-rdma/msg49575.html
[2] https://patchwork.kernel.org/patch/9752865/
[3] https://www.spinics.net/lists/linux-rdma/msg50827.html
[4] https://www.spinics.net/lists/linux-rdma/msg51210.html
[5] https://patchwork.kernel.org/patch/9811729/ and https://patchwork.kernel.org/patch/9811731/]

Cc Doug Ledford <[email protected]>
Cc Ariel Almog <[email protected]>
Cc Dennis Dalessandro <[email protected]>
Cc Jason Gunthorpe <[email protected]>
Cc Linux RDMA <[email protected]>
Cc Linux Netdev <[email protected]>

Leon Romanovsky (6):
rdma: Add basic infrastructure for RDMA tool
rdma: Add dev object
rdma: Add device capability parsing
rdma: Add link option and parsing
rdma: Add FW version to the device output
rdma: Add initial manual for the tool

 Makefile          |   2 +-
 man/man8/Makefile |   3 +-
 man/man8/rdma.8   |  82 ++++++++++++++
 rdma/.gitignore   |   1 +
 rdma/Makefile     |  22 ++++
 rdma/dev.c        | 145 +++++++++++++++++++++++++
 rdma/link.c       | 202 +++++++++++++++++++++++++++++++++++
 rdma/rdma.c       | 112 ++++++++++++++++++++
 rdma/rdma.h       |  90 ++++++++++++++++
 rdma/utils.c      | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 10 files changed, 969 insertions(+), 2 deletions(-)
 create mode 100644 man/man8/rdma.8
 create mode 100644 rdma/.gitignore
 create mode 100644 rdma/Makefile
 create mode 100644 rdma/dev.c
 create mode 100644 rdma/link.c
 create mode 100644 rdma/rdma.c
 create mode 100644 rdma/rdma.h
 create mode 100644 rdma/utils.c
#1 lore raw

PATCH 1/6 rdma: Add basic infrastructure for RDMA tool

From: Leon Romanovsky <[email protected]>

RDMA devices are cross-functional devices from one side, but very tailored for the specific markets from another.

Such diversity caused to spread of RDMA related configuration across various tools, e.g. devlink, ip, ethtool, ib specific and vendor specific solutions.

This patch adds ability to fill device and port information by reading RDMA netlink.

---
 Makefile        |   2 +-
 rdma/.gitignore |   1 +
 rdma/Makefile   |  22 +++++
 rdma/rdma.c     | 110 +++++++++++++++++++++++
 rdma/rdma.h     |  76 ++++++++++++++++
 rdma/utils.c    | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 480 insertions(+), 1 deletion(-)
 create mode 100644 rdma/.gitignore
 create mode 100644 rdma/Makefile
 create mode 100644 rdma/rdma.c
 create mode 100644 rdma/rdma.h
 create mode 100644 rdma/utils.c
Makefile +1 -1
index 18de7dcb..c255063b 100644
@@ -52,7 +52,7 @@ WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2
 CFLAGS := $(WFLAGS) $(CCOPTS) -I../include $(DEFINES) $(CFLAGS)
 YACCFLAGS = -d -t -v
 
-SUBDIRS=lib ip tc bridge misc netem genl tipc devlink man
+SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma man
 
 LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
 LDLIBS += $(LIBNETLINK)
rdma/.gitignore new file +1 -0
new file mode 100644
index 00000000..51fb172b
@@ -0,0 +1 @@
+rdma
rdma/Makefile new file +22 -0
new file mode 100644
index 00000000..64da2142
@@ -0,0 +1,22 @@
+include ../Config
+
+ifeq ($(HAVE_MNL),y)
+
+RDMA_OBJ = rdma.o utils.o
+
+TARGETS=rdma
+CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
+LDLIBS += $(shell $(PKG_CONFIG) libmnl --libs)
+
+endif
+
+all:	$(TARGETS) $(LIBS)
+
+rdma:	$(RDMA_OBJ) $(LIBS)
+	$(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
+
+install: all
+	install -m 0755 $(TARGETS) $(DESTDIR)$(SBINDIR)
+
+clean:
+	rm -f $(RDMA_OBJ) $(TARGETS)
rdma/rdma.c new file +110 -0

110 lines not on this page · raw message

rdma/rdma.h new file +76 -0

76 lines not on this page · raw message

rdma/utils.c new file +270 -0

270 lines not on this page · raw message

Signature · 1 line
2.13.1
#2 lore raw

PATCH 2/6 rdma: Add dev object

In reply to Leon Romanovsky

From: Leon Romanovsky <[email protected]>

Device (dev) object represents struct ib_device to user space.

The supported commands are show, set and help, but it doesn't print anything except device name at this stage. The downstream patches will fill this object with subcommands.

Print all devices:

 # rdma dev
1: mlx5_0:
2: mlx5_1:
3: mlx5_2:

Print specific device:

 # rdma dev show mlx5_1
2: mlx5_1:
---
 rdma/Makefile |  2 +-
 rdma/dev.c    | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/rdma.c   |  3 ++-
 rdma/rdma.h   |  6 ++++++
 rdma/utils.c  | 39 ++++++++++++++++++++++++++++++++++-----
 5 files changed, 98 insertions(+), 7 deletions(-)
 create mode 100644 rdma/dev.c
rdma/Makefile +1 -1
index 64da2142..123d7ac5 100644
@@ -2,7 +2,7 @@ include ../Config
 
 ifeq ($(HAVE_MNL),y)
 
-RDMA_OBJ = rdma.o utils.o
+RDMA_OBJ = rdma.o utils.o dev.o
 
 TARGETS=rdma
 CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
rdma/dev.c new file +55 -0

55 lines not on this page · raw message

rdma/rdma.c +2 -1
index 9c754da3..f904532c 100644
@@ -18,7 +18,7 @@
 static void help(char *name)
 {
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
-	       "where  OBJECT := { help }\n"
+	       "where  OBJECT := { dev | help }\n"
 	       "       OPTIONS := { -V[ersion] }\n", name);
 }
 
@@ -33,6 +33,7 @@ static int rd_cmd(struct rdma *rd)
 	const struct rdma_cmd cmds[] = {
 		{ NULL,		cmd_help },
 		{ "help",	cmd_help },
+		{ "dev",	cmd_dev },
 		{ 0 }
 	};
 
rdma/rdma.h +6 -0
index 9841aebf..f5e104ec 100644
@@ -58,12 +58,18 @@ bool rd_no_arg(struct rdma *rd);
 bool rd_argv_match(struct rdma *rd, const char *pattern);
 void rd_arg_inc(struct rdma *rd);
 
+/*
+ * Commands interface
+ */
+int cmd_dev(struct rdma *rd);
 int rdma_exec_cmd(struct rdma *rd, const struct rdma_cmd *c, const char *str);
 
 /*
  * Device manipulation
  */
 void rdma_free_devmap(struct rdma *rd);
+struct dev_map *dev_map_lookup(struct rdma *rd, bool allow_port_index);
+struct dev_map *_dev_map_lookup(struct rdma *rd, const char *dev_name);
 
 /*
  * Netlink
rdma/utils.c +34 -5
index 96278a4c..4d29eced 100644
@@ -128,8 +128,10 @@ static int port_map_alloc(struct dev_map *dev_map, uint32_t num_ports)
 }
 
 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,
 	[RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_CAP_FLAGS] = MNL_TYPE_U64,
 };
 
 int rd_attr_cb(const struct nlattr *attr, void *data)
@@ -156,10 +158,9 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
 	struct rdma *rd = data;
 	const char *dev_name;
 	uint32_t num_ports;
-	static int i = 1;
 
 	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
-	if (!tb[RDMA_NLDEV_ATTR_DEV_NAME])
+	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
 		return MNL_CB_ERROR;
 	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
 		pr_err("This tool doesn't support switches yet\n");
@@ -167,18 +168,18 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
 	}
 
 	dev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
-	num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
-
 	dev_map = dev_map_alloc(dev_name);
 	if (!dev_map)
 		/* The main function will cleanup the allocations */
 		return MNL_CB_ERROR;
 	list_add_tail(&dev_map->list, &rd->dev_map_list);
-	dev_map->idx = i++;
 
+	num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
 	if (port_map_alloc(dev_map, num_ports))
 		return MNL_CB_ERROR;
 	dev_map->num_ports = num_ports;
+	dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
+	dev_map->caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
 
 	return MNL_CB_OK;
 }
@@ -268,3 +269,31 @@ int rdma_recv_msg(struct rdma *rd, mnl_cb_t callback, void *data, unsigned int s
 	mnl_socket_close(rd->nl);
 	return ret;
 }
+
+struct dev_map *_dev_map_lookup(struct rdma *rd, const char *dev_name)
+{
+	struct dev_map *dev_map;
+
+	list_for_each_entry(dev_map, &rd->dev_map_list, list)
+		if (strcmp(dev_name, dev_map->dev_name) == 0)
+			return dev_map;
+
+	return NULL;
+}
+struct dev_map *dev_map_lookup(struct rdma *rd, bool allow_port_index)
+{
+	struct dev_map *dev_map;
+	char *dev_name;
+	char *slash;
+
+	dev_name = strdup(rd_argv(rd));
+	if (allow_port_index) {
+		slash = strrchr(dev_name, '/');
+		if (slash)
+			*slash = '\0';
+	}
+
+	dev_map = _dev_map_lookup(rd, dev_name);
+	free(dev_name);
+	return dev_map;
+}
Signature · 1 line
2.13.1

A message that is not in the archive (sent off-list or not yet received): 20170627143920.28020-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org

#4 lore raw

PATCH 3/6 rdma: Add device capability parsing

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>

Add parsing interface for the device capability flags

$ rdma dev show
1: mlx5_0:
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
2: mlx5_1:
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
3: mlx5_2:
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
4: mlx5_3:
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
5: mlx5_4:
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
root@mtr-leonro:~#
$ rdma dev show mlx5_4
5: mlx5_4:
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
---
 rdma/dev.c   | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 rdma/rdma.h  |  3 ++
 rdma/utils.c |  2 +-
 3 files changed, 95 insertions(+), 9 deletions(-)
rdma/dev.c +91 -8
index d4809d63..76f4af88 100644
@@ -17,28 +17,111 @@ static int dev_help(struct rdma *rd)
 	return 0;
 }
 
-static void dev_one_show(const struct dev_map *dev_map)
+static const char *dev_caps[64] = {
+	"RESIZE_MAX_WR",
+	"BAD_PKEY_CNTR",
+	"BAD_QKEY_CNTR",
+	"RAW_MULTI",
+	"AUTO_PATH_MIG",
+	"CHANGE_PHY_PORT",
+	"UD_AV_PORT_ENFORCE",
+	"CURR_QP_STATE_MOD",
+	"SHUTDOWN_PORT",
+	"INIT_TYPE",
+	"PORT_ACTIVE_EVENT",
+	"SYS_IMAGE_GUID",
+	"RC_RNR_NAK_GEN",
+	"SRQ_RESIZE",
+	"N_NOTIFY_CQ",
+	"LOCAL_DMA_LKEY",
+	"RESERVED",
+	"MEM_WINDOW",
+	"UD_IP_CSUM",
+	"UD_TSO",
+	"XRC",
+	"MEM_MGT_EXTENSIONS",
+	"BLOCK_MULTICAST_LOOPBACK",
+	"MEM_WINDOW_TYPE_2A",
+	"MEM_WINDOW_TYPE_2B",
+	"RC_IP_CSUM",
+	"RAW_IP_CSUM",
+	"CROSS_CHANNEL",
+	"MANAGED_FLOW_STEERING",
+	"SIGNATURE_HANDOVER",
+	"ON_DEMAND_PAGING",
+	"SG_GAPS_REG",
+	"VIRTUAL_FUNCTION",
+	"RAW_SCATTER_FCS",
+	"RDMA_NETDEV_OPA_VNIC",
+};
+
+static int dev_print_caps(struct rdma *rd)
 {
-	pr_out("%u: %s:\n", dev_map->idx, dev_map->dev_name);
+	struct dev_map *dev_map = rd->dev_map_curr;
+	uint64_t caps = dev_map->caps;
+	bool found = false;
+	uint32_t idx;
+
+	pr_out("    caps: <");
+	for (idx = 0; idx < 64; idx++) {
+		if (caps & 0x1) {
+			pr_out("%s", dev_caps[idx]?dev_caps[idx]:"UNKNONW");
+			if (caps >> 0x1)
+				pr_out(", ");
+			found = true;
+		}
+		caps >>= 0x1;
+	}
+	if(!found)
+		pr_out("NONE");
+
+	pr_out(">\n");
+	return 0;
+}
+
+static int dev_no_args(struct rdma *rd)
+{
+	struct dev_map *dev_map = rd->dev_map_curr;
+
+	pr_out("%u: %s: \n", dev_map->idx, dev_map->dev_name);
+	return dev_print_caps(rd);
+}
+
+static int dev_one_show(struct rdma *rd)
+{
+	const struct rdma_cmd cmds[] = {
+		{ NULL,		dev_no_args},
+		{ 0 }
+	};
+
+	return rdma_exec_cmd(rd, cmds, "parameter");
+
 }
 
 static int dev_show(struct rdma *rd)
 {
 	struct dev_map *dev_map;
+	int ret = 0;
 
 	if (rd_no_arg(rd)) {
-		list_for_each_entry(dev_map, &rd->dev_map_list, list)
-			dev_one_show(dev_map);
+		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
+			rd->dev_map_curr = dev_map;
+			ret = dev_one_show(rd);
+			if (ret)
+				return ret;
+		}
+
 	}
 	else {
-		dev_map = dev_map_lookup(rd, false);
-		if (!dev_map) {
+		rd->dev_map_curr = dev_map_lookup(rd, false);
+		if (!rd->dev_map_curr) {
 			pr_err("Wrong device name\n");
 			return -ENOENT;
 		}
-		dev_one_show(dev_map);
+		rd_arg_inc(rd);
+		ret = dev_one_show(rd);
 	}
-	return 0;
+	return ret;
 }
 
 int cmd_dev(struct rdma *rd)
rdma/rdma.h +3 -0
index f5e104ec..8cca0f28 100644
@@ -34,6 +34,7 @@ struct dev_map {
 	uint32_t num_ports;
 	struct list_head port_map_list;
 	uint32_t idx;
+	uint64_t caps;
 };
 
 struct rdma {
@@ -41,6 +42,7 @@ struct rdma {
 	char **argv;
 	char *filename;
 	struct list_head dev_map_list;
+	struct dev_map *dev_map_curr;
 	struct mnl_socket *nl;
 	struct nlmsghdr *nlh;
 	char *buff;
@@ -57,6 +59,7 @@ struct rdma_cmd {
 bool rd_no_arg(struct rdma *rd);
 bool rd_argv_match(struct rdma *rd, const char *pattern);
 void rd_arg_inc(struct rdma *rd);
+char *rd_argv(struct rdma *rd);
 
 /*
  * Commands interface
rdma/utils.c +1 -1
index 4d29eced..94737c5c 100644
@@ -28,7 +28,7 @@ static int rd_argc(struct rdma *rd)
 	return rd->argc;
 }
 
-static char *rd_argv(struct rdma *rd)
+char *rd_argv(struct rdma *rd)
 {
 	if (!rd_argc(rd))
 		return NULL;
Signature · 6 lines
2.13.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): 20170627143920.28020-4-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org

#6 lore raw

Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing

Quoted 27 lines · On Tue, 27 Jun 2017 17:39:17 +0300 Leon Romanovsky…
rdma/dev.c +27 -0
+static const char *dev_caps[64] = {
+	"RESIZE_MAX_WR",
+	"BAD_PKEY_CNTR",
+	"BAD_QKEY_CNTR",
+	"RAW_MULTI",
+	"AUTO_PATH_MIG",
+	"CHANGE_PHY_PORT",
+	"UD_AV_PORT_ENFORCE",
+	"CURR_QP_STATE_MOD",
+	"SHUTDOWN_PORT",
+	"INIT_TYPE",
+	"PORT_ACTIVE_EVENT",
+	"SYS_IMAGE_GUID",
+	"RC_RNR_NAK_GEN",
+	"SRQ_RESIZE",
+	"N_NOTIFY_CQ",
+	"LOCAL_DMA_LKEY",
+	"RESERVED",
+	"MEM_WINDOW",
+	"UD_IP_CSUM",
+	"UD_TSO",
+	"XRC",
+	"MEM_MGT_EXTENSIONS",
+	"BLOCK_MULTICAST_LOOPBACK",
+	"MEM_WINDOW_TYPE_2A",
+	"MEM_WINDOW_TYPE_2B",
+	"RC_IP_CSUM",

rdma/dev.c static int dev_help(struct rdma *rd) · line 56

Quoted 10 lines
rdma/dev.c +10 -0
+	"RAW_IP_CSUM",
+	"CROSS_CHANNEL",
+	"MANAGED_FLOW_STEERING",
+	"SIGNATURE_HANDOVER",
+	"ON_DEMAND_PAGING",
+	"SG_GAPS_REG",
+	"VIRTUAL_FUNCTION",
+	"RAW_SCATTER_FCS",
+	"RDMA_NETDEV_OPA_VNIC",
+};

Please use array initializer so that header and capabilities don't get different values. Are the bit values in some rdma header file?
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#7 lore raw

Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing

Quoted 35 lines · Stephen Hemminger
Quoted 32 lines · On Tue, 27 Jun 2017 17:39:17 +0300 Leon Romanovsky…
rdma/dev.c +32 -0
+static const char *dev_caps[64] = {
+	"RESIZE_MAX_WR",
+	"BAD_PKEY_CNTR",
+	"BAD_QKEY_CNTR",
+	"RAW_MULTI",
+	"AUTO_PATH_MIG",
+	"CHANGE_PHY_PORT",
+	"UD_AV_PORT_ENFORCE",
+	"CURR_QP_STATE_MOD",
+	"SHUTDOWN_PORT",
+	"INIT_TYPE",
+	"PORT_ACTIVE_EVENT",
+	"SYS_IMAGE_GUID",
+	"RC_RNR_NAK_GEN",
+	"SRQ_RESIZE",
+	"N_NOTIFY_CQ",
+	"LOCAL_DMA_LKEY",
+	"RESERVED",
+	"MEM_WINDOW",
+	"UD_IP_CSUM",
+	"UD_TSO",
+	"XRC",
+	"MEM_MGT_EXTENSIONS",
+	"BLOCK_MULTICAST_LOOPBACK",
+	"MEM_WINDOW_TYPE_2A",
+	"MEM_WINDOW_TYPE_2B",
+	"RC_IP_CSUM",
+	"RAW_IP_CSUM",
+	"CROSS_CHANNEL",
+	"MANAGED_FLOW_STEERING",
+	"SIGNATURE_HANDOVER",
+	"ON_DEMAND_PAGING",
Quoted 8 lines

rdma/dev.c static int dev_help(struct rdma *rd) · line 56

Quoted 5 lines
rdma/dev.c +5 -0
+	"SG_GAPS_REG",
+	"VIRTUAL_FUNCTION",
+	"RAW_SCATTER_FCS",
+	"RDMA_NETDEV_OPA_VNIC",
+};

Please use array initializer so that header and capabilities don't get different values. Are the bit values in some rdma header file?

It is enum ib_device_cap_flags copied from include/rdma/ib_verbs.h. These enum ib_device_cap_flags and enum ib_port_cap_flags are not exposed to the user (include/uapi/rdma/*) and I'm planning to move them there in next cycle.

Thanks

#8 lore raw

PATCH 5/6 rdma: Add FW version to the device output

In reply to a message not in the archive

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>

$ rdma dev show mlx5_4
5: mlx5_4: fw 2.8.9999
    caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
---
 rdma/dev.c   | 9 ++++++++-
 rdma/rdma.h  | 1 +
 rdma/utils.c | 4 ++++
 3 files changed, 13 insertions(+), 1 deletion(-)
rdma/dev.c +8 -1
index 76f4af88..45dc0b3f 100644
@@ -83,7 +83,14 @@ static int dev_no_args(struct rdma *rd)
 {
 	struct dev_map *dev_map = rd->dev_map_curr;
 
-	pr_out("%u: %s: \n", dev_map->idx, dev_map->dev_name);
+	pr_out("%u: %s: ", dev_map->idx, dev_map->dev_name);
+	if (strlen(dev_map->fw_version) < 1)
+		/*
+		 * if no FW, the return string from RDMA netlink is "\0"
+		 */
+		pr_out("fw NONE\n");
+	else
+		pr_out("fw %s\n", dev_map->fw_version);
 	return dev_print_caps(rd);
 }
 
rdma/rdma.h +1 -0
index 553a4fc2..f221575e 100644
@@ -36,6 +36,7 @@ struct dev_map {
 	struct list_head port_map_list;
 	uint32_t idx;
 	uint64_t caps;
+	char *fw_version;
 };
 
 struct rdma {
rdma/utils.c +4 -0
index 68ae3d3e..47a6ab11 100644
@@ -104,6 +104,7 @@ static void dev_map_free(struct dev_map *dev_map)
 		port_map_free(port_map);
 	}
 
+	free(dev_map->fw_version);
 	free(dev_map->dev_name);
 	free(dev_map);
 }
@@ -141,6 +142,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32,
 	[RDMA_NLDEV_ATTR_CAP_FLAGS] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING,
 };
 
 int rd_attr_cb(const struct nlattr *attr, void *data)
@@ -190,6 +192,8 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
 	dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
 	dev_map->caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
 
+	dev_map->fw_version = strdup(mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_FW_VERSION]));
+
 	return MNL_CB_OK;
 }
 
Signature · 6 lines
2.13.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#9 lore raw

PATCH 6/6 rdma: Add initial manual for the tool

In reply to a message not in the archive

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>

---
 man/man8/Makefile |  3 +-
 man/man8/rdma.8   | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 man/man8/rdma.8
man/man8/Makefile +2 -1
index f3318644..81979a07 100644
@@ -19,7 +19,8 @@ MAN8PAGES = $(TARGETS) ip.8 arpd.8 lnstat.8 routel.8 rtacct.8 rtmon.8 rtpr.8 ss.
 	tc-simple.8 tc-skbedit.8 tc-vlan.8 tc-xt.8 tc-skbmod.8 tc-ife.8 \
 	tc-tunnel_key.8 tc-sample.8 \
 	devlink.8 devlink-dev.8 devlink-monitor.8 devlink-port.8 devlink-sb.8 \
-	ifstat.8
+	ifstat.8 \
+	rdma.8
 
 all: $(TARGETS)
 
man/man8/rdma.8 new file +82 -0

82 lines not on this page · raw message

Signature · 6 lines
2.13.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#10 lore raw

PATCH 4/6 rdma: Add link option and parsing

In reply to Leon Romanovsky

From: Leon Romanovsky <[email protected]>

Add link object interface together with port capability parsing command

$ rdma link
1/1: mlx5_0/1:
    caps: <AUTO_MIGR>
2/1: mlx5_1/1:
    caps: <AUTO_MIGR>
3/1: mlx5_2/1:
    caps: <AUTO_MIGR>
4/1: mlx5_3/1:
    caps: <CM, IP_BASED_GIDS>
5/1: mlx5_4/1:
    caps: <AUTO_MIGR>
$ rdma link show mlx5_4
5/1: mlx5_4/1:
    caps: <AUTO_MIGR>
---
 rdma/Makefile |   2 +-
 rdma/link.c   | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/rdma.c   |   1 +
 rdma/rdma.h   |   4 ++
 rdma/utils.c  |   9 +++
 5 files changed, 217 insertions(+), 1 deletion(-)
 create mode 100644 rdma/link.c
rdma/Makefile +1 -1
index 123d7ac5..1a9e4b1a 100644
@@ -2,7 +2,7 @@ include ../Config
 
 ifeq ($(HAVE_MNL),y)
 
-RDMA_OBJ = rdma.o utils.o dev.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o
 
 TARGETS=rdma
 CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
rdma/link.c new file +202 -0

202 lines not on this page · raw message

rdma/rdma.c +1 -0
index f904532c..ec6c2edb 100644
@@ -34,6 +34,7 @@ static int rd_cmd(struct rdma *rd)
 		{ NULL,		cmd_help },
 		{ "help",	cmd_help },
 		{ "dev",	cmd_dev },
+		{ "link",	cmd_link },
 		{ 0 }
 	};
 
rdma/rdma.h +4 -0
index 8cca0f28..553a4fc2 100644
@@ -26,6 +26,7 @@
 struct port_map {
 	struct list_head list;
 	uint32_t idx;
+	uint64_t caps;
 };
 
 struct dev_map {
@@ -43,6 +44,7 @@ struct rdma {
 	char *filename;
 	struct list_head dev_map_list;
 	struct dev_map *dev_map_curr;
+	struct port_map *port_map_curr;
 	struct mnl_socket *nl;
 	struct nlmsghdr *nlh;
 	char *buff;
@@ -60,11 +62,13 @@ bool rd_no_arg(struct rdma *rd);
 bool rd_argv_match(struct rdma *rd, const char *pattern);
 void rd_arg_inc(struct rdma *rd);
 char *rd_argv(struct rdma *rd);
+uint32_t get_port_from_argv(struct rdma *rd);
 
 /*
  * Commands interface
  */
 int cmd_dev(struct rdma *rd);
+int cmd_link(struct rdma *rd);
 int rdma_exec_cmd(struct rdma *rd, const struct rdma_cmd *c, const char *str);
 
 /*
rdma/utils.c +9 -0
index 94737c5c..68ae3d3e 100644
@@ -62,6 +62,15 @@ bool rd_no_arg(struct rdma *rd)
 	return rd_argc(rd) == 0;
 }
 
+uint32_t get_port_from_argv(struct rdma *rd)
+{
+        char *slash;
+
+        slash = strchr(rd_argv(rd), '/');
+        /* if no port found, return 0 */
+        return (slash) ? (atoi(slash + 1)):0;
+}
+
 static struct dev_map *dev_map_alloc(const char *dev_name)
 {
 	struct dev_map *dev_map;
Signature · 1 line
2.13.1