Skip to contentSkip to conversation

RDMAtool

PATCH In review Leon Romanovsky 5 participants 19 messages Jul 4, 2017 – Jul 11, 2017 2 messages not in the archive

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v3 cover RDMAtool

Hi,

This is third 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].

The following is an example of various runs on my machine with 5 devices (4 in IB mode and one in Ethernet mode)

### Without parameters

$ rdma
Usage: rdma [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { dev | link | help }
       OPTIONS := { -V[ersion] | -d[etails]}

### With unspecified device name

$ rdma dev
1: mlx5_0: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:3457 sys_image_guid 5254:00c0:fe12:3457
2: mlx5_1: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:3458 sys_image_guid 5254:00c0:fe12:3458
3: mlx5_2: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:3459 sys_image_guid 5254:00c0:fe12:3459
4: mlx5_3: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:345a sys_image_guid 5254:00c0:fe12:345a
5: mlx5_4: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:345b sys_image_guid 5254:00c0:fe12:345b

### Detailed mode

$ rdma -d dev
1: mlx5_0: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:3457 sys_image_guid 5254:00c0:fe12:3457
    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: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:3458 sys_image_guid 5254:00c0:fe12:3458
    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: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:3459 sys_image_guid 5254:00c0:fe12:3459
    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: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:345a sys_image_guid 5254:00c0:fe12:345a
    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: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:345b sys_image_guid 5254:00c0:fe12:345b
    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>

### Specific device

$ rdma dev show mlx5_4
5: mlx5_4: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:345b sys_image_guid 5254:00c0:fe12:345b

### Specific device in detailed mode

$ rdma dev show mlx5_4 -d
5: mlx5_4: node_type SWITCH fw 2.8.9999 node_guid 5254:00c0:fe12:345b sys_image_guid 5254:00c0:fe12:345b
    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>

### Unknown command (caps)

$ rdma dev show mlx5_4 caps
Unknown parameter 'caps'.

### Link properties without device name

$ rdma link
1/1: mlx5_0/1: subnet_prefix fe80:0000:0000:0000 lid 13399 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
2/1: mlx5_1/1: subnet_prefix fe80:0000:0000:0000 lid 13400 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
3/1: mlx5_2/1: subnet_prefix fe80:0000:0000:0000 lid 13401 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
4/1: mlx5_3/1: state DOWN physical_state DISABLED
5/1: mlx5_4/1: subnet_prefix fe80:0000:0000:0000 lid 13403 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP

### Link properties in detailed mode

$ rdma link -d
1/1: mlx5_0/1: subnet_prefix fe80:0000:0000:0000 lid 13399 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
    caps: <AUTO_MIGR>
2/1: mlx5_1/1: subnet_prefix fe80:0000:0000:0000 lid 13400 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
    caps: <AUTO_MIGR>
3/1: mlx5_2/1: subnet_prefix fe80:0000:0000:0000 lid 13401 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
    caps: <AUTO_MIGR>
4/1: mlx5_3/1: state DOWN physical_state DISABLED
    caps: <CM, IP_BASED_GIDS>
5/1: mlx5_4/1: subnet_prefix fe80:0000:0000:0000 lid 13403 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
    caps: <AUTO_MIGR>

### All links for specific device

$ rdma link show mlx5_3
1/1: mlx5_0/1: subnet_prefix fe80:0000:0000:0000 lid 13399 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP

### Detailed link properties for specific device

$ rdma link -d show mlx5_3
1/1: mlx5_0/1: subnet_prefix fe80:0000:0000:0000 lid 13399 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP
    caps: <AUTO_MIGR>

### Specific port for specific device

$ rdma link show mlx5_4/1
1/1: mlx5_0/1: subnet_prefix fe80:0000:0000:0000 lid 13399 sm_lid 49151 lmc 0 state ACTIVE physical_state LINK_UP

### Unknown parameter

$ rdma link show mlx5_4/1 caps
Unknown parameter 'caps'.

Thanks

Changelog:
v2->v3:
* Removed MAX()
* Reduced scope of rd_argv_match
* Removed return from rdma_free_devmap
* Added extra break at rdma_send_msg
v1->v2:
* Squashed multiple (and similar) patches to be one patch for dev object and one patch for link object.
* Removed port_map struct
* Removed global netlink dump during initialization, it removed the need to store the intermediate variables and reuse ability of netlink to signal if variable exists or doesn't.
* Added "-d" --details option and put all CAPs under it.

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-v2" 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-v2

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 <ariela-VPRAkNaXOzVWk0Htik3J/[email protected]>
Cc Linux RDMA <[email protected]>
Cc Linux Netdev <[email protected]>

Leon Romanovsky (4):
rdma: Add basic infrastructure for RDMA tool
rdma: Add dev object
rdma: Add link object
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        | 235 +++++++++++++++++++++++++++++++++++++++++++++
 rdma/link.c       | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/rdma.c       | 118 +++++++++++++++++++++++
 rdma/rdma.h       |  80 ++++++++++++++++
 rdma/utils.c      | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 10 files changed, 1091 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

--
2.13.2

--
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

#1 lore raw

PATCH v3 1/4 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     | 116 +++++++++++++++++++++++++++++
 rdma/rdma.h     |  70 ++++++++++++++++++
 rdma/utils.c    | 223 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 433 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 +116 -0

116 lines not on this page · raw message

rdma/rdma.h new file +70 -0

70 lines not on this page · raw message

rdma/utils.c new file +223 -0

223 lines not on this page · raw message

#2 lore raw

Re: [PATCH iproute2 V3 1/4] rdma: Add basic infrastructure for RDMA tool

Quoted 13 lines · Tue, Jul 04, 2017 at 09:55:38AM CEST, [email protected] wrote:

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.

[...]

Quoted 28 lines
rdma/utils.c new file +28 -0
+
+int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
+	struct dev_map *dev_map;
+	struct rdma *rd = data;
+	const char *dev_name;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_NAME] || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
+		return MNL_CB_ERROR;
+	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
+		pr_err("This tool doesn't support switches yet\n");
+		return MNL_CB_ERROR;
+	}
+
+	dev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
+
+	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->num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
+	dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
+
+	return MNL_CB_OK;

rdma/utils.c line 148

Quoted 10 lines
rdma/utils.c new file +10 -0
+}
+
+void rdma_free_devmap(struct rdma *rd)
+{
+	if(!rd)
+		return;
+	dev_map_cleanup(rd);
+}
+
+int rdma_exec_cmd(struct rdma *rd, const struct rdma_cmd *cmds, const char *str)

Sometimes the functions are prefixed "rd_", sometimes "rdma_". I think it would be nice to unify this with "rd_".

Quoted 19 lines
rdma/utils.c new file +19 -0
+{
+	const struct rdma_cmd *c;
+
+	/* First argument in objs table is default variant */
+	if (rd_no_arg(rd))
+		return cmds->func(rd);
+
+	for (c = cmds + 1; c->cmd; ++c) {
+		if (rd_argv_match(rd, c->cmd)) {
+			/* Move to next argument */
+			rd_arg_inc(rd);
+			return c->func(rd);
+		}
+	}
+
+	pr_err("Unknown %s '%s'.\n", str, rd_argv(rd));
+	return 0;
+}
+
#3 lore raw

Re: [PATCH iproute2 V3 1/4] rdma: Add basic infrastructure for RDMA tool

Quoted 51 lines · Jiri Pirko
Quoted 13 lines · Tue, Jul 04, 2017 at 09:55:38AM CEST, [email protected].…

From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[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.

[...]

Quoted 33 lines
rdma/utils.c new file +33 -0
+
+int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
+	struct dev_map *dev_map;
+	struct rdma *rd = data;
+	const char *dev_name;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_NAME] || !tb[RDMA_NLDEV_ATTR_DEV_INDEX])
+		return MNL_CB_ERROR;
+	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
+		pr_err("This tool doesn't support switches yet\n");
+		return MNL_CB_ERROR;
+	}
+
+	dev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]);
+
+	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->num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
+	dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
+
+	return MNL_CB_OK;
+}
+
+void rdma_free_devmap(struct rdma *rd)
+{
+	if(!rd)
Quoted 8 lines

rdma/utils.c line 148

Quoted 5 lines
rdma/utils.c new file +5 -0
+		return;
+	dev_map_cleanup(rd);
+}
+
+int rdma_exec_cmd(struct rdma *rd, const struct rdma_cmd *cmds, const char *str)

Sometimes the functions are prefixed "rd_", sometimes "rdma_". I think it would be nice to unify this with "rd_".

Right, I'll fix.

Quoted 21 lines
Quoted 21 lines
rdma/utils.c new file +19 -0
+{
+	const struct rdma_cmd *c;
+
+	/* First argument in objs table is default variant */
+	if (rd_no_arg(rd))
+		return cmds->func(rd);
+
+	for (c = cmds + 1; c->cmd; ++c) {
+		if (rd_argv_match(rd, c->cmd)) {
+			/* Move to next argument */
+			rd_arg_inc(rd);
+			return c->func(rd);
+		}
+	}
+
+	pr_err("Unknown %s '%s'.\n", str, rd_argv(rd));
+	return 0;
+}
+
#4 lore raw

PATCH v3 2/4 rdma: Add dev object

In reply to Leon Romanovsky

From: Leon Romanovsky <[email protected]>

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

Device properties:
* Device capabilities
* FW version to the device output
* node_guid and sys_image_guid
* node_type

---
 rdma/Makefile |   2 +-
 rdma/dev.c    | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/rdma.c   |   3 +-
 rdma/rdma.h   |  12 ++-
 rdma/utils.c  |  46 +++++++++++-
 5 files changed, 293 insertions(+), 5 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 +235 -0

235 lines not on this page · raw message

rdma/rdma.c +2 -1
index 29273839..dfebd71e 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] | -d[etails]}\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 +11 -1
index 0c01b091..2856e592 100644
@@ -16,7 +16,6 @@
 #include <errno.h>
 #include <getopt.h>
 #include <libmnl/libmnl.h>
-
 #include <rdma/rdma_netlink.h>
 #include "list.h"
 
@@ -36,6 +35,8 @@ struct rdma {
 	char *filename;
 	bool show_details;
 	struct list_head dev_map_list;
+	uint32_t dev_idx;
+	uint32_t port_idx;
 	struct mnl_socket *nl;
 	struct nlmsghdr *nlh;
 	char *buff;
@@ -51,13 +52,22 @@ struct rdma_cmd {
  */
 bool rd_no_arg(struct rdma *rd);
 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);
 
 /*
  * 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 +44 -2

75 lines not on this page · raw message

#5 lore raw

Re: [PATCH iproute2 V3 2/4] rdma: Add dev object

Quoted 12 lines · Leon Romanovsky

From: Leon Romanovsky <[email protected]>

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

Device properties:
* Device capabilities
* FW version to the device output
* node_guid and sys_image_guid
* node_type

---

<...>

Quoted 6 lines
rdma/dev.c new file +6 -0
+}
+
+static void dev_print_node_type(struct nlattr **tb)
+{
+	uint8_t node_type;
+	/*

rdma/dev.c line 136

Quoted 10 lines
rdma/dev.c new file +10 -0
+	 * FIXME: move to index exported by the kernel
+	 */
+	static const char *str[] = {
+		"UNKNOWN",
+		"SWITCH",
+		"ROUTER",
+		"RNIC",
+		"USNIC",
+		"USNIC_UDP",
+	};

There is a bug here, i forgot to add "CA" to the list of node_types (before SWITCH). Thanks to Or Gerlitz who spotted it.

Thanks

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

#7 lore raw

Re: [PATCH iproute2 V3 2/4] rdma: Add dev object

Quoted 57 lines · Tue, Jul 04, 2017 at 09:55:39AM CEST, [email protected].…

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

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

Device properties:
* Device capabilities
* FW version to the device output
* node_guid and sys_image_guid
* node_type

---

rdma/Makefile |   2 +-
rdma/dev.c    | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rdma/rdma.c   |   3 +-
rdma/rdma.h   |  12 ++-
rdma/utils.c  |  46 +++++++++++-
5 files changed, 293 insertions(+), 5 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 +18 -0
new file mode 100644
index 00000000..b80e5288
@@ -0,0 +1,235 @@
+/*
+ * dev.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/[email protected]>
+ */
+
+#include "rdma.h"
+
+static int dev_help(struct rdma *rd)
+{
+	pr_out("Usage: %s dev show [DEV]\n", rd->filename);
+	return 0;
+}

rdma/dev.c line 28

Quoted 10 lines
rdma/dev.c new file +10 -0
+
+static void dev_print_caps(struct nlattr **tb)
+{
+	uint64_t caps;
+	uint32_t idx;
+
+	/*
+	 * FIXME: move to indexes when kernel will start exporting them.
+	 */
+	static const char *dev_caps[64] = {
	static const char *dev_caps[] = {
Quoted 55 lines
rdma/dev.c new file +55 -0
+		"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",
+	};
+
+	if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS])
+	       return;
+
+	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
+
+	pr_out("\n    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(", ");
+		}
+		caps >>= 0x1;
+	}
+
+	pr_out(">");
+}
+

rdma/dev.c line 93

Quoted 10 lines
rdma/dev.c new file +10 -0
+static void dev_print_fw(struct nlattr **tb)
+{
+	if (!tb[RDMA_NLDEV_ATTR_FW_VERSION])
+		return;
+
+	pr_out("fw %s ",
+	       mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_FW_VERSION]));
+}
+
+static void _dev_print_be64(char *name, uint64_t val)

Why the initial "_"? I think it could be avoided.

Wait, I'm confused. Does kernel actually exposes BE64 in U64 attribute? That is wrong. Please fix it while there is still a time (if it is).

Quoted 25 lines
rdma/dev.c new file +25 -0
+{
+	uint16_t vp[4];
+
+	memcpy(vp, &val, sizeof(uint64_t));
+	pr_out("%s %04x:%04x:%04x:%04x ", name, vp[3], vp[2], vp[1], vp[0]);
+}
+
+static void dev_print_node_guid(struct nlattr **tb)
+{
+	uint64_t node_guid;
+
+	if (!tb[RDMA_NLDEV_ATTR_NODE_GUID])
+		return;
+
+	node_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_NODE_GUID]);
+	_dev_print_be64("node_guid", node_guid);
+}
+
+static void dev_print_sys_image_guid(struct nlattr **tb)
+{
+       uint64_t	sys_image_guid;
+
+	if (!tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID])
+		return;
+

rdma/dev.c line 128

Quoted 10 lines
rdma/dev.c new file +10 -0
+	sys_image_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID]);
+	_dev_print_be64("sys_image_guid", sys_image_guid);
+}
+
+static void dev_print_node_type(struct nlattr **tb)
+{
+	uint8_t node_type;
+	/*
+	 * FIXME: move to index exported by the kernel
+	 */

So fix it rightaway :)

Quoted 5 lines
rdma/dev.c new file +5 -0
+	static const char *str[] = {
+		"UNKNOWN",
+		"SWITCH",
+		"ROUTER",
+		"RNIC",

rdma/dev.c line 143

Quoted 10 lines
rdma/dev.c new file +10 -0
+		"USNIC",
+		"USNIC_UDP",
+	};
+
+	if (!tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE])
+		return;
+
+	node_type = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE]);
+
+	if (node_type < 7 )

Magic? :O

Quoted 41 lines
rdma/dev.c new file +41 -0
+		pr_out("node_type %s ", str[node_type]);
+	else
+		pr_out("node_type UNKNOWN ");
+}
+
+static int dev_parse_cb(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
+	struct rdma *rd = data;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
+		return MNL_CB_ERROR;
+
+	pr_out("%u: %s: ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]),
+	       mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]));
+	dev_print_node_type(tb);
+	dev_print_fw(tb);
+	dev_print_node_guid(tb);
+	dev_print_sys_image_guid(tb);
+	if (rd->show_details)
+		dev_print_caps(tb);
+
+	pr_out("\n");
+	return MNL_CB_OK;
+}
+
+
+static int dev_no_args(struct rdma *rd)
+{
+	uint32_t seq;
+	int ret;
+
+	rdma_prepare_msg(rd, RDMA_NLDEV_CMD_GET, &seq, (NLM_F_REQUEST | NLM_F_ACK));
+	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
+	if ((ret = rdma_send_msg(rd)))
+		return ret;
+
+	return rdma_recv_msg(rd, dev_parse_cb, rd, seq);
+}

rdma/dev.c line 194

Quoted 10 lines
rdma/dev.c new file +10 -0
+
+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");
+

Drop the extra empty line.

Quoted 5 lines
rdma/dev.c new file +5 -0
+}
+
+static int dev_show(struct rdma *rd)
+{
+	struct dev_map *dev_map;

rdma/dev.c line 209

Quoted 10 lines
rdma/dev.c new file +10 -0
+	int ret = 0;
+
+	if (rd_no_arg(rd)) {
+		list_for_each_entry(dev_map, &rd->dev_map_list, list) {
+			rd->dev_idx = dev_map->idx;
+			ret = dev_one_show(rd);
+			if (ret)
+				return ret;
+		}
+

Drop the extra empty line.

rdma/dev.c line 211

Quoted 2 lines
rdma/dev.c new file +2 -0
+	}
+	else {

"} else {"

Checkpatch should warn you. Did you run it?

Quoted 50 lines
rdma/dev.c new file +24 -0
+		dev_map = dev_map_lookup(rd, false);
+		if (!dev_map) {
+			pr_err("Wrong device name\n");
+			return -ENOENT;
+		}
+		rd_arg_inc(rd);
+		rd->dev_idx = dev_map->idx;
+		ret = dev_one_show(rd);
+	}
+	return ret;
+}
+
+int cmd_dev(struct rdma *rd)
+{
+	const struct rdma_cmd cmds[] = {
+		{ NULL,		dev_show },
+		{ "show",	dev_show },
+		{ "list",	dev_show },
+		{ "help",	dev_help },
+		{ 0 }
+	};
+
+	return rdma_exec_cmd(rd, cmds, "dev command");
+}
rdma/rdma.c +2 -1
index 29273839..dfebd71e 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] | -d[etails]}\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 +0 -0
index 0c01b091..2856e592 100644

rdma/rdma.h line 19

Quoted 4 lines
rdma/rdma.h +0 -1
@@ -16,7 +16,6 @@
 #include <errno.h>
 #include <getopt.h>
 #include <libmnl/libmnl.h>
-

:) Please push this line removal to the previous patch.

Quoted 49 lines
rdma/rdma.h +11 -0
 #include <rdma/rdma_netlink.h>
 #include "list.h"
 
@@ -36,6 +35,8 @@ struct rdma {
 	char *filename;
 	bool show_details;
 	struct list_head dev_map_list;
+	uint32_t dev_idx;
+	uint32_t port_idx;
 	struct mnl_socket *nl;
 	struct nlmsghdr *nlh;
 	char *buff;
@@ -51,13 +52,22 @@ struct rdma_cmd {
 */
 bool rd_no_arg(struct rdma *rd);
 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);
 
 /*
 * 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 +1 -1
index b554eff7..bee490da 100644
@@ -21,7 +21,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;

rdma/utils.c bool rd_no_arg(struct rdma *rd) · line 64

Quoted 10 lines
rdma/utils.c +7 -0
@@ -55,6 +55,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;
	return slash ? atoi(slash + 1) : 0;
Quoted 21 lines
rdma/utils.c +8 -0
+}
+
 static struct dev_map *dev_map_alloc(const char *dev_name)
 {
 	struct dev_map *dev_map;
@@ -88,8 +97,14 @@ static void dev_map_cleanup(struct rdma *rd)
 }
 
 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,
+	[RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING,
+	[RDMA_NLDEV_ATTR_NODE_GUID] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_DEV_NODE_TYPE] = MNL_TYPE_U8,
 };
 
 int rd_attr_cb(const struct nlattr *attr, void *data)

rdma/utils.c int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data) · line 137

Quoted 4 lines
rdma/utils.c +0 -1
@@ -134,7 +149,6 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)
 
 	dev_map->num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
 	dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
-

Again, should be part of the previous patch.

Quoted 36 lines
rdma/utils.c +28 -1
 	return MNL_CB_OK;
 }
 
@@ -221,3 +235,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;
+}
--
Quoted 2 lines

2.13.2

--
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

#8 lore raw

Re: [PATCH iproute2 V3 2/4] rdma: Add dev object

Quoted 62 lines · Jiri Pirko
Quoted 61 lines · Tue, Jul 04, 2017 at 09:55:39AM CEST, [email protected].…

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

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

Device properties:
* Device capabilities
* FW version to the device output
* node_guid and sys_image_guid
* node_type

---

rdma/Makefile |   2 +-
rdma/dev.c    | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rdma/rdma.c   |   3 +-
rdma/rdma.h   |  12 ++-
rdma/utils.c  |  46 +++++++++++-
5 files changed, 293 insertions(+), 5 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 +22 -0
new file mode 100644
index 00000000..b80e5288
@@ -0,0 +1,235 @@
+/*
+ * dev.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/[email protected]>
+ */
+
+#include "rdma.h"
+
+static int dev_help(struct rdma *rd)
+{
+	pr_out("Usage: %s dev show [DEV]\n", rd->filename);
+	return 0;
+}
+
+static void dev_print_caps(struct nlattr **tb)
+{
+	uint64_t caps;
Quoted 8 lines

rdma/dev.c line 28

Quoted 6 lines
rdma/dev.c new file +6 -0
+	uint32_t idx;
+
+	/*
+	 * FIXME: move to indexes when kernel will start exporting them.
+	 */
+	static const char *dev_caps[64] = {
	static const char *dev_caps[] = {

The same as for the "link" object.

Quoted 39 lines
Quoted 39 lines
rdma/dev.c new file +37 -0
+		"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",
+	};
+

<...>

Quoted 11 lines

rdma/dev.c line 93

Quoted 8 lines
rdma/dev.c new file +8 -0
+	if (!tb[RDMA_NLDEV_ATTR_FW_VERSION])
+		return;
+
+	pr_out("fw %s ",
+	       mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_FW_VERSION]));
+}
+
+static void _dev_print_be64(char *name, uint64_t val)

Why the initial "_"? I think it could be avoided.

Quoted 2 lines

Wait, I'm confused. Does kernel actually exposes BE64 in U64 attribute? That is wrong. Please fix it while there is still a time (if it is).

It was, I fixed it in the last version of my RDMA netlink patches as a response to Jason's comment.

The "_be64" suffix in the name is a leftover from dark ages. I'll fix it.

Quoted 9 lines
Quoted 9 lines
rdma/dev.c new file +7 -0
+{
+	uint16_t vp[4];
+
+	memcpy(vp, &val, sizeof(uint64_t));
+	pr_out("%s %04x:%04x:%04x:%04x ", name, vp[3], vp[2], vp[1], vp[0]);
+}
+

<...>

Quoted 9 lines

rdma/dev.c

Quoted 4 lines
rdma/dev.c new file +2 -0
+	}
+	else {

"} else {"

Checkpatch should warn you. Did you run it?

Partially.

Thanks

#9 lore raw

PATCH v3 3/4 rdma: Add link object

In reply to Leon Romanovsky

From: Leon Romanovsky <[email protected]>

Link (port) object represent struct ib_port to the user space.

Link properties:
* Port capabilities
* IB subnet prefix
* LID, SM_LID and LMC
* Port state
* Physical state

---
 rdma/Makefile |   2 +-
 rdma/link.c   | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rdma/rdma.c   |   3 +-
 rdma/utils.c  |   5 ++
 4 files changed, 288 insertions(+), 2 deletions(-)
 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 +280 -0

280 lines not on this page · raw message

rdma/rdma.c +2 -1
index dfebd71e..f597f614 100644
@@ -18,7 +18,7 @@
 static void help(char *name)
 {
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
-	       "where  OBJECT := { dev | help }\n"
+	       "where  OBJECT := { dev | link | help }\n"
 	       "       OPTIONS := { -V[ersion] | -d[etails]}\n", name);
 }
 
@@ -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/utils.c +5 -0
index bee490da..ca61ccc1 100644
@@ -104,6 +104,11 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_NODE_GUID] = MNL_TYPE_U64,
 	[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_LID] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_SM_LID] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_LMC] = MNL_TYPE_U8,
+	[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,
 };
#10 lore raw

Re: [PATCH iproute2 V3 3/4] rdma: Add link object

Quoted 55 lines · Tue, Jul 04, 2017 at 09:55:40AM CEST, [email protected] wrote:

From: Leon Romanovsky <[email protected]>

Link (port) object represent struct ib_port to the user space.

Link properties:
* Port capabilities
* IB subnet prefix
* LID, SM_LID and LMC
* Port state
* Physical state

---

rdma/Makefile |   2 +-
rdma/link.c   | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rdma/rdma.c   |   3 +-
rdma/utils.c  |   5 ++
4 files changed, 288 insertions(+), 2 deletions(-)

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 +16 -0
new file mode 100644
index 00000000..f92b4cef
@@ -0,0 +1,280 @@
+/*
+ * link.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 <[email protected]>
+ */
+
+#include "rdma.h"
+
+static int link_help(struct rdma *rd)
+{
+	pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename);

rdma/link.c line 26

Quoted 10 lines
rdma/link.c new file +10 -0
+	return 0;
+}
+
+static void link_print_caps(struct nlattr **tb)
+{
+	uint64_t caps;
+	uint32_t idx;
+
+	/*
+	 * FIXME: move to indexes when kernel will start exporting them.

Not exported yet?

rdma/link.c line 28

Quoted 2 lines
rdma/link.c new file +2 -0
+	 */
+	static const char *link_caps[64] = {

[]

Quoted 28 lines
rdma/link.c new file +28 -0
+		"UNKNOWN",
+		"SM",
+		"NOTICE",
+		"TRAP",
+		"OPT_IPD",
+		"AUTO_MIGR",
+		"SL_MAP",
+		"MKEY_NVRAM",
+		"PKEY_NVRAM",
+		"LED_INFO",
+		"SM_DISABLED",
+		"SYS_IMAGE_GUID",
+		"PKEY_SW_EXT_PORT_TRAP",
+		"UNKNOWN",
+		"EXTENDED_SPEEDS",
+		"UNKNOWN",
+		"CM",
+		"SNMP_TUNNEL",
+		"REINIT",
+		"DEVICE_MGMT",
+		"VENDOR_CLASS",
+		"DR_NOTICE",
+		"CAP_MASK_NOTICE",
+		"BOOT_MGMT",
+		"LINK_LATENCY",
+		"CLIENT_REG",
+		"IP_BASED_GIDS",
+	};

rdma/link.c line 66

Quoted 10 lines
rdma/link.c new file +10 -0
+
+	if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS])
+		return;
+
+	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
+
+	pr_out("\n    caps: <");
+	for (idx = 0; idx < 64; idx++) {
+		if (caps & 0x1) {
+			pr_out("%s", link_caps[idx]?link_caps[idx]:"UNKNONW");

"link_caps[idx] ? link_caps[idx] : "UNKNOWN""

note the s/UNKNONW/UNKNOWN/

rdma/link.c line 70

Quoted 4 lines
rdma/link.c new file +4 -0
+			if (caps >> 0x1)
+				pr_out(", ");
+		}
+		caps >>= 0x1;

Interesting.

Quoted 6 lines
rdma/link.c new file +6 -0
+	}
+
+	pr_out(">");
+}
+
+static void link_print_subnet_prefix(struct nlattr **tb)

rdma/link.c line 86

Quoted 10 lines
rdma/link.c new file +10 -0
+{
+	uint64_t subnet_prefix;
+	uint16_t sp[4];
+
+	if (!tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX])
+		return;
+
+	subnet_prefix = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]);
+	memcpy(sp, &subnet_prefix, sizeof(uint64_t));
+	pr_out("subnet_prefix %04x:%04x:%04x:%04x ", sp[3], sp[2], sp[1], sp[0]);

You have similar pr_out helper in the previous patch. Perhaps you can re-use it?

Quoted 4 lines
rdma/link.c new file +4 -0
+}
+
+static void link_print_lid(struct nlattr **tb)
+{

rdma/link.c line 100

Quoted 10 lines
rdma/link.c new file +10 -0
+	if (!tb[RDMA_NLDEV_ATTR_LID])
+		return;
+
+	pr_out("lid %u ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_LID]));
+}
+
+static void link_print_sm_lid(struct nlattr **tb)
+{
+

Avoid the extra empty line.

Quoted 10 lines
rdma/link.c new file +10 -0
+	if (!tb[RDMA_NLDEV_ATTR_SM_LID])
+		return;
+
+	pr_out("sm_lid %u ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_SM_LID]));
+}
+
+static void link_print_lmc(struct nlattr **tb)
+{
+	if (!tb[RDMA_NLDEV_ATTR_LMC])

rdma/link.c line 120

Quoted 10 lines
rdma/link.c new file +10 -0
+		return;
+
+	pr_out("lmc %u ", mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_LMC]));
+}
+
+static void link_print_state(struct nlattr **tb)
+{
+	uint8_t state;
+	/*
+	 * FIXME: move to index exported by the kernel

Again, can't this be fixed now?

Quoted 6 lines
rdma/link.c new file +6 -0
+	 */
+	static const char *str[] = {
+		"NOP",
+		"DOWN",
+		"INIT",
+		"ARMED",

rdma/link.c line 136

Quoted 10 lines
rdma/link.c new file +10 -0
+		"ACTIVE",
+		"ACTIVE_DEFER",
+	};
+
+	if (!tb[RDMA_NLDEV_ATTR_PORT_STATE])
+		return;
+
+	state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_STATE]);
+
+	if (state < 6 )

Magic?

rdma/link.c line 146

Quoted 10 lines
rdma/link.c new file +10 -0
+		pr_out("state %s ", str[state]);
+	else
+		pr_out("state UNKNOWN ");
+}
+
+static void link_print_phys_state(struct nlattr **tb)
+{
+	uint8_t phys_state;
+	/*
+	 * FIXME: move to index exported by the kernel

Again, can't this be fixed now?

Quoted 7 lines
rdma/link.c new file +7 -0
+	 */
+	static const char *str[] = {
+		"UNKNOWN",
+		"SLEEP",
+		"POLLING",
+		"DISABLED",
+		"PORT_CONFIGURATION_TRAINING",

rdma/link.c line 163

Quoted 10 lines
rdma/link.c new file +10 -0
+		"LINK_UP",
+		"LINK_ERROR_RECOVER",
+		"PHY_TEST",
+	};
+
+	if (!tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE])
+		return;
+
+	phys_state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]);
+	if (phys_state < 8)

Magic?

Quoted 50 lines
rdma/link.c new file +50 -0
+		pr_out("physical_state %s ", str[phys_state]);
+	else
+		pr_out("physical_state UNKNOWN ");
+}
+
+static int link_parse_cb(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
+	struct rdma *rd = data;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
+		return MNL_CB_ERROR;
+
+	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
+		pr_err("This tool doesn't support switches yet\n");
+		return MNL_CB_ERROR;
+	}
+
+	pr_out("%u/%u: %s/%u: ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]),
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]),
+	       mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]),
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]));
+	link_print_subnet_prefix(tb);
+	link_print_lid(tb);
+	link_print_sm_lid(tb);
+	link_print_lmc(tb);
+	link_print_state(tb);
+	link_print_phys_state(tb);
+	if (rd->show_details)
+		link_print_caps(tb);
+
+	pr_out("\n");
+	return MNL_CB_OK;
+}
+
+static int link_no_args(struct rdma *rd)
+{
+	uint32_t seq;
+	int ret;
+
+	rdma_prepare_msg(rd, RDMA_NLDEV_CMD_PORT_GET, &seq, (NLM_F_REQUEST | NLM_F_ACK));
+	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
+	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx);
+	if ((ret = rdma_send_msg(rd)))
+		return ret;
+
+	return rdma_recv_msg(rd, link_parse_cb, rd, seq);
+}

rdma/link.c line 223

Quoted 10 lines
rdma/link.c new file +10 -0
+
+static int link_one_show(struct rdma *rd)
+{
+	const struct rdma_cmd cmds[] = {
+		{ NULL,		link_no_args},
+		{ 0 }
+	};
+
+	return rdma_exec_cmd(rd, cmds, "parameter");
+

Avoid the extra empty line.

Quoted 19 lines
rdma/link.c new file +19 -0
+}
+
+static int link_show(struct rdma *rd)
+{
+	struct dev_map *dev_map;
+	uint32_t port;
+	int ret = 0;
+
+	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++) {
+				rd->port_idx = port;
+				ret = link_one_show(rd);
+				if (ret)
+					return ret;
+			}
+		}
+

rdma/link.c line 252

Quoted 10 lines
rdma/link.c new file +10 -0
+	}
+	else {
+		dev_map = dev_map_lookup(rd, true);
+		port = get_port_from_argv(rd);
+		if (!dev_map || port > dev_map->num_ports) {
+			pr_err("Wrong device name\n");
+			return -ENOENT;
+		}
+		rd_arg_inc(rd);
+		rd->port_idx = port ? :1;

"port ? : 1"

Quoted 4 lines
rdma/link.c new file +4 -0
+		for (; port < dev_map->num_ports + 1; port++, rd->port_idx++) {
+			ret = link_one_show(rd);
+			if (ret)
+				return ret;

rdma/link.c line 266

Quoted 10 lines
rdma/link.c new file +10 -0
+			if (port)
+				/*
+				 * We got request to show link for devname
+				 * without port index.
+				 */
+				break;
+		}
+
+	}
+	return ret;

You can do return 0 here and avoid ret initialization.

Quoted 58 lines
rdma/link.c new file +14 -0
+}
+
+int cmd_link(struct rdma *rd)
+{
+	const struct rdma_cmd cmds[] = {
+		{ NULL,		link_show },
+		{ "show",	link_show },
+		{ "list",	link_show },
+		{ "help",	link_help },
+		{ 0 }
+	};
+
+	return rdma_exec_cmd(rd, cmds, "link command");
+}
rdma/rdma.c +2 -1
index dfebd71e..f597f614 100644
@@ -18,7 +18,7 @@
 static void help(char *name)
 {
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
-	       "where  OBJECT := { dev | help }\n"
+	       "where  OBJECT := { dev | link | help }\n"
 	       "       OPTIONS := { -V[ersion] | -d[etails]}\n", name);
 }
 
@@ -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/utils.c +5 -1
index bee490da..ca61ccc1 100644
@@ -104,6 +104,11 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_NODE_GUID] = MNL_TYPE_U64,
 	[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_LID] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_SM_LID] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_LMC] = MNL_TYPE_U8,
+	[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,
 };
 
--

2.13.2

--
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

#11 lore raw

Re: [PATCH iproute2 V3 3/4] rdma: Add link object

Quoted 60 lines · Jiri Pirko
Quoted 59 lines · Tue, Jul 04, 2017 at 09:55:40AM CEST, [email protected] wrote:

From: Leon Romanovsky <[email protected]>

Link (port) object represent struct ib_port to the user space.

Link properties:
* Port capabilities
* IB subnet prefix
* LID, SM_LID and LMC
* Port state
* Physical state

---

rdma/Makefile |   2 +-
rdma/link.c   | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rdma/rdma.c   |   3 +-
rdma/utils.c  |   5 ++
4 files changed, 288 insertions(+), 2 deletions(-)

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 +20 -0
new file mode 100644
index 00000000..f92b4cef
@@ -0,0 +1,280 @@
+/*
+ * link.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 <[email protected]>
+ */
+
+#include "rdma.h"
+
+static int link_help(struct rdma *rd)
+{
+	pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename);
+	return 0;
+}
+
+static void link_print_caps(struct nlattr **tb)
Quoted 8 lines

rdma/link.c line 26

Quoted 6 lines
rdma/link.c new file +6 -0
+{
+	uint64_t caps;
+	uint32_t idx;
+
+	/*
+	 * FIXME: move to indexes when kernel will start exporting them.

Not exported yet?

Not yet, I want to minimize the UAPI export from kernel before user-space part is accepted.

Quoted 7 lines

rdma/link.c line 28

Quoted 5 lines
rdma/link.c new file +2 -0
+	 */
+	static const char *link_caps[64] = {

[]

It will require from me to fill all 64 fields.
In current version, I'm leveraging the fact that static is initialized to zero (NULL).

Quoted 43 lines
Quoted 30 lines
rdma/link.c new file +28 -0
+		"UNKNOWN",
+		"SM",
+		"NOTICE",
+		"TRAP",
+		"OPT_IPD",
+		"AUTO_MIGR",
+		"SL_MAP",
+		"MKEY_NVRAM",
+		"PKEY_NVRAM",
+		"LED_INFO",
+		"SM_DISABLED",
+		"SYS_IMAGE_GUID",
+		"PKEY_SW_EXT_PORT_TRAP",
+		"UNKNOWN",
+		"EXTENDED_SPEEDS",
+		"UNKNOWN",
+		"CM",
+		"SNMP_TUNNEL",
+		"REINIT",
+		"DEVICE_MGMT",
+		"VENDOR_CLASS",
+		"DR_NOTICE",
+		"CAP_MASK_NOTICE",
+		"BOOT_MGMT",
+		"LINK_LATENCY",
+		"CLIENT_REG",
+		"IP_BASED_GIDS",
+	};

rdma/link.c line 66

Quoted 10 lines
rdma/link.c new file +10 -0
+
+	if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS])
+		return;
+
+	caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]);
+
+	pr_out("\n    caps: <");
+	for (idx = 0; idx < 64; idx++) {
+		if (caps & 0x1) {
+			pr_out("%s", link_caps[idx]?link_caps[idx]:"UNKNONW");

"link_caps[idx] ? link_caps[idx] : "UNKNOWN""

Quoted 1 line

note the s/UNKNONW/UNKNOWN/

Right

Quoted 21 lines

rdma/link.c line 70

Quoted 6 lines
rdma/link.c new file +4 -0
+			if (caps >> 0x1)
+				pr_out(", ");
+		}
+		caps >>= 0x1;

Interesting.

Quoted 11 lines
rdma/link.c new file +11 -0
+	}
+
+	pr_out(">");
+}
+
+static void link_print_subnet_prefix(struct nlattr **tb)
+{
+	uint64_t subnet_prefix;
+	uint16_t sp[4];
+
+	if (!tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX])
Quoted 8 lines

rdma/link.c line 86

Quoted 5 lines
rdma/link.c new file +5 -0
+		return;
+
+	subnet_prefix = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]);
+	memcpy(sp, &subnet_prefix, sizeof(uint64_t));
+	pr_out("subnet_prefix %04x:%04x:%04x:%04x ", sp[3], sp[2], sp[1], sp[0]);

You have similar pr_out helper in the previous patch. Perhaps you can re-use it?

Sure

Quoted 19 lines
Quoted 6 lines
rdma/link.c new file +4 -0
+}
+
+static void link_print_lid(struct nlattr **tb)
+{

rdma/link.c line 100

Quoted 10 lines
rdma/link.c new file +10 -0
+	if (!tb[RDMA_NLDEV_ATTR_LID])
+		return;
+
+	pr_out("lid %u ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_LID]));
+}
+
+static void link_print_sm_lid(struct nlattr **tb)
+{
+

Avoid the extra empty line.

Will remove

Quoted 15 lines
Quoted 15 lines
rdma/link.c new file +14 -0
+	if (!tb[RDMA_NLDEV_ATTR_SM_LID])
+		return;
+
+	pr_out("sm_lid %u ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_SM_LID]));
+}
+
+static void link_print_lmc(struct nlattr **tb)
+{
+	if (!tb[RDMA_NLDEV_ATTR_LMC])
+		return;
+
+	pr_out("lmc %u ", mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_LMC]));
+}
Quoted 9 lines

rdma/link.c line 120

Quoted 6 lines
rdma/link.c new file +6 -0
+
+static void link_print_state(struct nlattr **tb)
+{
+	uint8_t state;
+	/*
+	 * FIXME: move to index exported by the kernel

Again, can't this be fixed now?

Not yet, it will be fixed in the second step.

Quoted 143 lines
Quoted 7 lines
rdma/link.c new file +6 -0
+	 */
+	static const char *str[] = {
+		"NOP",
+		"DOWN",
+		"INIT",
+		"ARMED",

rdma/link.c line 136

Quoted 10 lines
rdma/link.c new file +10 -0
+		"ACTIVE",
+		"ACTIVE_DEFER",
+	};
+
+	if (!tb[RDMA_NLDEV_ATTR_PORT_STATE])
+		return;
+
+	state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_STATE]);
+
+	if (state < 6 )

Magic?

rdma/link.c line 146

Quoted 10 lines
rdma/link.c new file +10 -0
+		pr_out("state %s ", str[state]);
+	else
+		pr_out("state UNKNOWN ");
+}
+
+static void link_print_phys_state(struct nlattr **tb)
+{
+	uint8_t phys_state;
+	/*
+	 * FIXME: move to index exported by the kernel

Again, can't this be fixed now?

Quoted 7 lines
rdma/link.c new file +7 -0
+	 */
+	static const char *str[] = {
+		"UNKNOWN",
+		"SLEEP",
+		"POLLING",
+		"DISABLED",
+		"PORT_CONFIGURATION_TRAINING",

rdma/link.c line 163

Quoted 10 lines
rdma/link.c new file +10 -0
+		"LINK_UP",
+		"LINK_ERROR_RECOVER",
+		"PHY_TEST",
+	};
+
+	if (!tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE])
+		return;
+
+	phys_state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]);
+	if (phys_state < 8)

Magic?

Quoted 50 lines
rdma/link.c new file +50 -0
+		pr_out("physical_state %s ", str[phys_state]);
+	else
+		pr_out("physical_state UNKNOWN ");
+}
+
+static int link_parse_cb(const struct nlmsghdr *nlh, void *data)
+{
+	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
+	struct rdma *rd = data;
+
+	mnl_attr_parse(nlh, 0, rd_attr_cb, tb);
+	if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME])
+		return MNL_CB_ERROR;
+
+	if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
+		pr_err("This tool doesn't support switches yet\n");
+		return MNL_CB_ERROR;
+	}
+
+	pr_out("%u/%u: %s/%u: ",
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]),
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]),
+	       mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]),
+	       mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]));
+	link_print_subnet_prefix(tb);
+	link_print_lid(tb);
+	link_print_sm_lid(tb);
+	link_print_lmc(tb);
+	link_print_state(tb);
+	link_print_phys_state(tb);
+	if (rd->show_details)
+		link_print_caps(tb);
+
+	pr_out("\n");
+	return MNL_CB_OK;
+}
+
+static int link_no_args(struct rdma *rd)
+{
+	uint32_t seq;
+	int ret;
+
+	rdma_prepare_msg(rd, RDMA_NLDEV_CMD_PORT_GET, &seq, (NLM_F_REQUEST | NLM_F_ACK));
+	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
+	mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx);
+	if ((ret = rdma_send_msg(rd)))
+		return ret;
+
+	return rdma_recv_msg(rd, link_parse_cb, rd, seq);
+}

rdma/link.c line 223

Quoted 10 lines
rdma/link.c new file +10 -0
+
+static int link_one_show(struct rdma *rd)
+{
+	const struct rdma_cmd cmds[] = {
+		{ NULL,		link_no_args},
+		{ 0 }
+	};
+
+	return rdma_exec_cmd(rd, cmds, "parameter");
+

Avoid the extra empty line.

Quoted 23 lines
rdma/link.c new file +23 -0
+}
+
+static int link_show(struct rdma *rd)
+{
+	struct dev_map *dev_map;
+	uint32_t port;
+	int ret = 0;
+
+	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++) {
+				rd->port_idx = port;
+				ret = link_one_show(rd);
+				if (ret)
+					return ret;
+			}
+		}
+
+	}
+	else {
+		dev_map = dev_map_lookup(rd, true);
+		port = get_port_from_argv(rd);
Quoted 8 lines

rdma/link.c line 252

Quoted 6 lines
rdma/link.c new file +6 -0
+		if (!dev_map || port > dev_map->num_ports) {
+			pr_err("Wrong device name\n");
+			return -ENOENT;
+		}
+		rd_arg_inc(rd);
+		rd->port_idx = port ? :1;

"port ? : 1"

Yeah, legal C, the same as (port) ? port : 1
ihttps://en.wikipedia.org/wiki/%3F:#C

Quoted 18 lines
Quoted 5 lines
rdma/link.c new file +4 -0
+		for (; port < dev_map->num_ports + 1; port++, rd->port_idx++) {
+			ret = link_one_show(rd);
+			if (ret)
+				return ret;

rdma/link.c line 266

Quoted 10 lines
rdma/link.c new file +10 -0
+			if (port)
+				/*
+				 * We got request to show link for devname
+				 * without port index.
+				 */
+				break;
+		}
+
+	}
+	return ret;

You can do return 0 here and avoid ret initialization.

Sure,

Thank you for the review.

Quoted 59 lines
Quoted 59 lines
rdma/link.c new file +14 -0
+}
+
+int cmd_link(struct rdma *rd)
+{
+	const struct rdma_cmd cmds[] = {
+		{ NULL,		link_show },
+		{ "show",	link_show },
+		{ "list",	link_show },
+		{ "help",	link_help },
+		{ 0 }
+	};
+
+	return rdma_exec_cmd(rd, cmds, "link command");
+}
rdma/rdma.c +2 -1
index dfebd71e..f597f614 100644
@@ -18,7 +18,7 @@
 static void help(char *name)
 {
 	pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
-	       "where  OBJECT := { dev | help }\n"
+	       "where  OBJECT := { dev | link | help }\n"
 	       "       OPTIONS := { -V[ersion] | -d[etails]}\n", name);
 }
 
@@ -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/utils.c +5 -1
index bee490da..ca61ccc1 100644
@@ -104,6 +104,11 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
 	[RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING,
 	[RDMA_NLDEV_ATTR_NODE_GUID] = MNL_TYPE_U64,
 	[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = MNL_TYPE_U64,
+	[RDMA_NLDEV_ATTR_LID] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_SM_LID] = MNL_TYPE_U32,
+	[RDMA_NLDEV_ATTR_LMC] = MNL_TYPE_U8,
+	[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,
 };
 
--

2.13.2

--
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

#12 lore raw

Re: [PATCH iproute2 V3 3/4] rdma: Add link object

Quoted 70 lines · Mon, Jul 10, 2017 at 06:22:23PM CEST, [email protected] wrote:
Quoted 60 lines · Jiri Pirko
Quoted 59 lines · Tue, Jul 04, 2017 at 09:55:40AM CEST, [email protected] wrote:

From: Leon Romanovsky <[email protected]>

Link (port) object represent struct ib_port to the user space.

Link properties:
* Port capabilities
* IB subnet prefix
* LID, SM_LID and LMC
* Port state
* Physical state

---

rdma/Makefile |   2 +-
rdma/link.c   | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rdma/rdma.c   |   3 +-
rdma/utils.c  |   5 ++
4 files changed, 288 insertions(+), 2 deletions(-)

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 +20 -0
new file mode 100644
index 00000000..f92b4cef
@@ -0,0 +1,280 @@
+/*
+ * link.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 <[email protected]>
+ */
+
+#include "rdma.h"
+
+static int link_help(struct rdma *rd)
+{
+	pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename);
+	return 0;
+}
+
+static void link_print_caps(struct nlattr **tb)
Quoted 8 lines

rdma/link.c line 26

Quoted 6 lines
rdma/link.c new file +6 -0
+{
+	uint64_t caps;
+	uint32_t idx;
+
+	/*
+	 * FIXME: move to indexes when kernel will start exporting them.

Not exported yet?

Quoted 2 lines

Not yet, I want to minimize the UAPI export from kernel before user-space part is accepted.

I don't get it. If you need it in userspace, you should expose it. Why to wait? What am I missing?

[...]

Quoted 6 lines
Quoted 3 lines

rdma/link.c line 252

Quoted 1 line
rdma/link.c new file +1 -0
+		rd->port_idx = port ? :1;

"port ? : 1"

Yeah, legal C, the same as (port) ? port : 1
ihttps://en.wikipedia.org/wiki/%3F:#C

I was referring to the missing " ". I'm a nitpicker :)

#13 lore raw

Re: [PATCH iproute2 V3 3/4] rdma: Add link object

Quoted 71 lines · Jiri Pirko
Quoted 70 lines · Mon, Jul 10, 2017 at 06:22:23PM CEST, [email protected] wrote:
Quoted 68 lines · Jiri Pirko
Quoted 55 lines · Tue, Jul 04, 2017 at 09:55:40AM CEST, [email protected] wrote:

From: Leon Romanovsky <[email protected]>

Link (port) object represent struct ib_port to the user space.

Link properties:
* Port capabilities
* IB subnet prefix
* LID, SM_LID and LMC
* Port state
* Physical state

---

rdma/Makefile |   2 +-
rdma/link.c   | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rdma/rdma.c   |   3 +-
rdma/utils.c  |   5 ++
4 files changed, 288 insertions(+), 2 deletions(-)

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 +16 -0
new file mode 100644
index 00000000..f92b4cef
@@ -0,0 +1,280 @@
+/*
+ * link.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 <[email protected]>
+ */
+
+#include "rdma.h"
+
+static int link_help(struct rdma *rd)
+{
+	pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename);

rdma/link.c line 26

Quoted 10 lines
rdma/link.c new file +10 -0
+	return 0;
+}
+
+static void link_print_caps(struct nlattr **tb)
+{
+	uint64_t caps;
+	uint32_t idx;
+
+	/*
+	 * FIXME: move to indexes when kernel will start exporting them.

Not exported yet?

Quoted 5 lines
Quoted 2 lines

Not yet, I want to minimize the UAPI export from kernel before user-space part is accepted.

I don't get it. If you need it in userspace, you should expose it. Why to wait? What am I missing?

Mainly my attempt to avoid constant rebasing for four series at the same time. One for rdmatool, one for RDMA netlink, one for RDMA UAPI changes and one for rdma-core [1] which should reuse those exported structures too.

[1] http://github.com/linux-rdma/rdma-core

Thanks

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

#15 lore raw

PATCH v3 4/4 rdma: Add initial manual for the tool

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

--
2.13.2

--
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

#16 lore raw
In reply to a message not in the archive
Quoted 10 lines · Tue, Jul 04, 2017 at 09:55:37AM CEST, [email protected].…

Hi,

This is third 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].

Quoted 8 lines

The following is an example of various runs on my machine with 5 devices (4 in IB mode and one in Ethernet mode)

### Without parameters

$ rdma
Usage: rdma [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { dev | link | help }
      OPTIONS := { -V[ersion] | -d[etails]}

What about json output? You will need it sooner than later. It will prevent you from a lot of headaches if you implement it right away. Lesson learned...
--
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

#17 lore raw
Quoted 20 lines · Jiri Pirko
Quoted 10 lines · Tue, Jul 04, 2017 at 09:55:37AM CEST, [email protected].…

Hi,

This is third 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].

Quoted 8 lines

The following is an example of various runs on my machine with 5 devices (4 in IB mode and one in Ethernet mode)

### Without parameters

$ rdma
Usage: rdma [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { dev | link | help }
      OPTIONS := { -V[ersion] | -d[etails]}
Quoted 3 lines

What about json output? You will need it sooner than later. It will prevent you from a lot of headaches if you implement it right away. Lesson learned...

I'm planning to do it in the coming kernel cycle.

Thanks

#18 lore raw
Quoted 21 lines · Mon, Jul 10, 2017 at 06:01:44PM CEST, [email protected] wrote:
Quoted 20 lines · Jiri Pirko
Quoted 18 lines · Tue, Jul 04, 2017 at 09:55:37AM CEST, [email protected] wrote:

Hi,

This is third 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].

The following is an example of various runs on my machine with 5 devices (4 in IB mode and one in Ethernet mode)

### Without parameters

$ rdma
Usage: rdma [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { dev | link | help }
      OPTIONS := { -V[ersion] | -d[etails]}
Quoted 5 lines
Quoted 3 lines

What about json output? You will need it sooner than later. It will prevent you from a lot of headaches if you implement it right away. Lesson learned...

I'm planning to do it in the coming kernel cycle.

Yeah, just consider pushing it in this initial patchset. Makes sense and saves you troubles. Up to you.

#19 lore raw
In reply to Leon Romanovsky
Quoted 3 lines · Tue, Jul 04, 2017 at 09:55:37AM CEST, [email protected] wrote:

Hi,

This is third version of series implementing the RDAMtool - the tool

s/RDAMtool/RDMAtool/

Quoted 7 lines

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].

Quoted 8 lines

The following is an example of various runs on my machine with 5 devices (4 in IB mode and one in Ethernet mode)

### Without parameters

$ rdma
Usage: rdma [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { dev | link | help }
      OPTIONS := { -V[ersion] | -d[etails]}

Do you plan to add "mon" any time soon?

#20 lore raw
Quoted 18 lines · Jiri Pirko
Quoted 3 lines · Tue, Jul 04, 2017 at 09:55:37AM CEST, [email protected].…

Hi,

This is third version of series implementing the RDAMtool - the tool

s/RDAMtool/RDMAtool/

Quoted 10 lines

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].

The following is an example of various runs on my machine with 5 devices (4 in IB mode and one in Ethernet mode)

Quoted 7 lines
Quoted 5 lines

### Without parameters

$ rdma
Usage: rdma [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { dev | link | help }
      OPTIONS := { -V[ersion] | -d[etails]}

Do you plan to add "mon" any time soon?

I don't know yet.

Thanks