RDMAtool
Subsystems (4)
v6 cover RDMAtool
From: Leon Romanovsky <[email protected]>
This is fifth revision of series implementing the RDAMtool - the tool to configure RDMA devices.
It looks like everyone who was interested to read cover letter already did it, so I'll start from the changelog:
Changelog:v5->v6:
* Removed double includes
* Copied rdma_netlink.h from he kernel to include/rdma folder, so the tool can be built as a standalone.v4->v5:
* Rebased to latest net-next branch
* Moved BIT() macro from devlink to general utils.h file - Patch #1.
* Changed the order of patches - moved man pages to be last patch.
* Rewrote all switch->case->return_string constructions to be static tables with help of David's macro magic. Thanks a lot.
* Dropped dependency on exported device and port properties. Now tool depends on RDMA netlink only and all needed code is already in Doug's for-next.
* Added two OPA specific physical link states, because their names is too broad - TEST and OFFLINE, I named it as OPA_TEST and OPA_OFFLINE.v3->v4:
* Rebased to latest net-next branch
* Added JSON output -j (json) and -p (pretty output)
* Exported and reused kernel UAPIs and defines instead of hard coded version.v2->v3:
* Removed MAX()
* Reduced scope of rd_argv_match
* Removed return from rdma_free_devmap
* Added extra break at rdma_send_msgv1->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 listRFC->v0:
* Removed everything that is not implemented yet.
* Abandoned sysfs interfaces in favor of netlink.
-----
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 Doug's for-next tag includes most of the needed patches for this tool.
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] | -j[son] | -p[retty]}### With unspecified device name
$ rdma dev 1: mlx5_0: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:3457 sys_image_guid 5254:00c0:fe12:3457 2: mlx5_1: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:3458 sys_image_guid 5254:00c0:fe12:3458 3: mlx5_2: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:3459 sys_image_guid 5254:00c0:fe12:3459 4: mlx5_3: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:345a sys_image_guid 5254:00c0:fe12:345a 5: mlx5_4: node_type ca 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 ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>
2: mlx5_1: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>
3: mlx5_2: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>
4: mlx5_3: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>
5: mlx5_4: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>### Specific device
$ rdma dev show mlx5_4 5: mlx5_4: node_type ca 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 ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>### 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'.
Available in the "topic/rdmatool-netlink-v6" 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-v6
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/]
Leon Romanovsky (8):
utils: Move BIT macro to common header
rdma: Add basic infrastructure for RDMA tool
rdma: Add dev object
rdma: Add link object
rdma: Add json and pretty outputs
rdma: Implement json output for dev object
rdma: Add json output to link object
rdma: Add initial manual for the tool
Makefile | 2 +- devlink/devlink.c | 2 +- include/rdma/rdma_netlink.h | 307 +++++++++++++++++++++++++++++++++++++++ include/utils.h | 2 + man/man8/rdma-dev.8 | 55 +++++++ man/man8/rdma-link.8 | 55 +++++++ man/man8/rdma.8 | 102 +++++++++++++ rdma/.gitignore | 1 + rdma/Makefile | 22 +++ rdma/dev.c | 284 ++++++++++++++++++++++++++++++++++++ rdma/link.c | 343 ++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 143 ++++++++++++++++++ rdma/rdma.h | 91 ++++++++++++ rdma/utils.c | 266 ++++++++++++++++++++++++++++++++++ 14 files changed, 1673 insertions(+), 2 deletions(-) create mode 100644 include/rdma/rdma_netlink.h create mode 100644 man/man8/rdma-dev.8 create mode 100644 man/man8/rdma-link.8 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
PATCH v6 1/8 utils: Move BIT macro to common header
From: Leon Romanovsky <[email protected]>
BIT() macro was implemented and used by devlink for now, but following patches of rdmatool will reuse the same macro, so put it in common header file.
--- devlink/devlink.c | 2 +- include/utils.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
devlink/devlink.c +1 -1
@@ -25,6 +25,7 @@#include "list.h" #include "mnlg.h" #include "json_writer.h" +#include "utils.h" #define ESWITCH_MODE_LEGACY "legacy"#define ESWITCH_MODE_SWITCHDEV "switchdev"
@@ -160,7 +161,6 @@ static void ifname_map_free(struct ifname_map *ifname_map)free (ifname_map); } -#define BIT (nr) (1UL << (nr))#define DL_OPT_HANDLE BIT(0)#define DL_OPT_HANDLEP BIT(1)#define DL_OPT_PORT_TYPE BIT(2)
include/utils.h +2 -0
@@ -196,6 +196,8 @@ static inline void __jiffies_to_tv(struct timeval *tv, unsigned long jiffies)int print_timestamp (FILE *fp);void print_nlmsg_timestamp (FILE *fp,const struct nlmsghdr *n); +#define BIT (nr) (1UL << (nr)) +#define ARRAY_SIZE (x) (sizeof(x) / sizeof((x)[0]))#define BUILD_BUG_ON (cond) ((void)sizeof(char[1 - 2 * !!(cond)]))
Signature · 1 line
2.14.1
PATCH v6 2/8 rdma: Add basic infrastructure for RDMA tool
In reply to Leon RomanovskyFrom: 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 +- include/rdma/rdma_netlink.h | 307 ++++++++++++++++++++++++++++++++++++++++++++ rdma/.gitignore | 1 + rdma/Makefile | 22 ++++ rdma/rdma.c | 116 +++++++++++++++++ rdma/rdma.h | 71 ++++++++++ rdma/utils.c | 217 +++++++++++++++++++++++++++++++ 7 files changed, 735 insertions(+), 1 deletion(-) create mode 100644 include/rdma/rdma_netlink.h 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
@@ -49,7 +49,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)
include/rdma/rdma_netlink.h new file +307 -0
307 lines not on this page · raw message
rdma/.gitignore new file +1 -0
@@ -0,0 +1 @@ +rdma
rdma/Makefile new file +22 -0
@@ -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 +71 -0
71 lines not on this page · raw message
rdma/utils.c new file +217 -0
217 lines not on this page · raw message
Signature · 1 line
2.14.1
PATCH v6 3/8 rdma: Add dev object
In reply to Leon RomanovskyFrom: 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 | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 3 +- rdma/rdma.h | 17 +++++ rdma/utils.c | 54 +++++++++++++- 5 files changed, 303 insertions(+), 3 deletions(-) create mode 100644 rdma/dev.c
rdma/Makefile +1 -1
@@ -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 +230 -0
230 lines not on this page · raw message
rdma/rdma.c +2 -1
@@ -15,7 +15,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); }
@@ -30,6 +30,7 @@ static int rd_cmd(struct rd *rd)const struct rd_cmd cmds[] = { {NULL , cmd_help }, {"help" , cmd_help }, + {"dev" , cmd_dev }, {0 } };
rdma/rdma.h +17 -0
@@ -20,10 +20,14 @@#include <time.h> #include "list.h" +#include "utils.h" #define pr_err(args...) fprintf(stderr, ##args) #define pr_out(args...) fprintf(stdout, ##args) +#define RDMA_BITMAP_ENUM (name, bit_no) RDMA_BITMAP_##name = BIT(bit_no), +#define RDMA_BITMAP_NAMES (name, bit_no) [bit_no] = #name, +struct dev_map {struct list_head list;char *dev_name;
@@ -37,6 +41,8 @@ struct rd {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;
@@ -53,12 +59,23 @@ struct rd_cmd {bool rd_no_arg (struct rd *rd);void rd_arg_inc (struct rd *rd); +char *rd_argv (struct rd *rd); +uint32_t get_port_from_argv (struct rd *rd); + +void rd_print_u64 (char *name,uint64_t val); +/* +* Commands interface +*/ +int cmd_dev (struct rd *rd); +int cmd_link (struct rd *rd);int rd_exec_cmd (struct rd *rd,const struct rd_cmd *c,const char *str);/* * Device manipulation */ void rd_free_devmap (struct rd *rd); +struct dev_map *dev_map_lookup (struct rd *rd,bool allow_port_index); +struct dev_map *_dev_map_lookup (struct rd *rd,const char *dev_name);/* * Netlink
rdma/utils.c +53 -1
77 lines not on this page · raw message
Signature · 1 line
2.14.1
PATCH v6 4/8 rdma: Add link object
In reply to Leon RomanovskyFrom: 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 | 277 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 3 +- rdma/utils.c | 5 ++ 4 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 rdma/link.c
rdma/Makefile +1 -1
@@ -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 +277 -0
277 lines not on this page · raw message
rdma/rdma.c +2 -1
@@ -15,7 +15,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); }
@@ -31,6 +31,7 @@ static int rd_cmd(struct rd *rd) { NULL, cmd_help }, { "help", cmd_help }, { "dev", cmd_dev }, + { "link", cmd_link }, { 0 } };
rdma/utils.c +5 -0
@@ -107,6 +107,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, };
Signature · 1 line
2.14.1
A message that is not in the archive (sent off-list or not yet received): 20170820095828.13812-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH v6 5/8 rdma: Add json and pretty outputs
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
--- rdma/rdma.c | 31 ++++++++++++++++++++++++++++--- rdma/rdma.h | 4 ++++ 2 files changed, 32 insertions(+), 3 deletions(-)
rdma/rdma.c +28 -3
@@ -16,7 +16,7 @@ static void help(char *name) {pr_out ("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n" "where OBJECT := { dev | link | help }\n" -" OPTIONS := { -V[ersion] | -d[etails]}\n" , name); +" OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty]}\n" , name); }static int cmd_help (struct rd *rd)
@@ -47,6 +47,16 @@ static int rd_init(struct rd *rd, int argc, char **argv, char *filename) rd->argc = argc; rd->argv = argv;INIT_LIST_HEAD (&rd->dev_map_list); + +if (rd->json_output) { + rd->jw =jsonw_new (stdout); +if (!rd->jw) { +pr_err ("Failed to create JSON writer\n" ); +return -ENOMEM ; + } +jsonw_pretty (rd->jw, rd->pretty_output); + } + rd->buff =malloc (MNL_SOCKET_BUFFER_SIZE );if (!rd->buff)return -ENOMEM ;
@@ -62,6 +72,8 @@ static int rd_init(struct rd *rd, int argc, char **argv, char *filename)static void rd_free (struct rd *rd) { +if (rd->json_output) +jsonw_destroy (&rd->jw);free (rd->buff);rd_free_devmap (rd); }
@@ -71,10 +83,14 @@ int main(int argc, char **argv)static const struct option long_options[] = { {"version" , no_argument,NULL ,'V' }, {"help" , no_argument,NULL ,'h' }, + {"json" , no_argument,NULL ,'j' }, + {"pretty" , no_argument,NULL ,'p' }, {"details" , no_argument,NULL ,'d' }, {NULL ,0 ,NULL ,0 } }; +bool pretty_output = false;bool show_details = false; +bool json_output = false;char *filename;struct rd rd;int opt;
@@ -82,16 +98,22 @@ int main(int argc, char **argv) filename =basename (argv[0 ]); -while ((opt =getopt_long (argc, argv,"Vhd" , +while ((opt =getopt_long (argc, argv,"Vhdpj" , long_options,NULL )) >=0 ) {switch (opt) {case 'V' :printf ("%s utility, iproute2-ss%s\n" , filename,SNAPSHOT );return EXIT_SUCCESS ; +case 'p' : + pretty_output = true; +break ;case 'd' : show_details = true;break ; +case 'j' : + json_output = true; +break ;case 'h' :help (filename);return EXIT_SUCCESS ;
@@ -105,11 +127,14 @@ int main(int argc, char **argv) argc -= optind; argv += optind; + rd.show_details = show_details; + rd.json_output = json_output; + rd.pretty_output = pretty_output; + err =rd_init (&rd, argc, argv, filename);if (err) goto out; - rd.show_details = show_details; err =rd_cmd (&rd); out:/* Always cleanup */
rdma/rdma.h +4 -0
@@ -21,6 +21,7 @@#include "list.h" #include "utils.h" +#include "json_writer.h" #define pr_err(args...) fprintf(stderr, ##args) #define pr_out(args...) fprintf(stdout, ##args)
@@ -46,6 +47,9 @@ struct rd {struct mnl_socket *nl;struct nlmsghdr *nlh;char *buff; +json_writer_t *jw; +bool json_output; +bool pretty_output; };struct rd_cmd {
Signature · 6 lines
2.14.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
PATCH v6 6/8 rdma: Implement json output for dev object
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The example output for machine with two devices
root@mtr-leonro:~# rdma dev -j -p
[{
"ifindex": 1,
"ifname": "mlx5_0",
"node_type": "ca",
"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_POR",
"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",
"MANAGED_FLOW_STEERING", "RESIZE_MAX_WR" ]
},{
"ifindex": 2,
"ifname": mlx5_1,
"node_type": "ca",
"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_POR",
"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",
"MANAGED_FLOW_STEERING", "RESIZE_MAX_WR" ]
}
]--- rdma/dev.c | 110 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 82 insertions(+), 28 deletions(-)
rdma/dev.c +82 -28
@@ -66,7 +66,7 @@ static const char *dev_caps_to_str(uint32_t idx)return "UNKNOWN" ; } -static void dev_print_caps (struct nlattr **tb) +static void dev_print_caps (struct rd *rd,struct nlattr **tb) {uint64_t caps;uint32_t idx;
@@ -76,48 +76,78 @@ static void dev_print_caps(struct nlattr **tb) caps =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_CAP_FLAGS ]); -pr_out ("\n caps: <" ); +if (rd->json_output) { +jsonw_name (rd->jw,"caps" ); +jsonw_start_array (rd->jw); + }else { +pr_out ("\n caps: <" ); + }for (idx =0 ; caps; idx++) {if (caps &0x1 ) { -pr_out ("%s" ,dev_caps_to_str (idx)); -if (caps >>0x1 ) -pr_out (", " ); +if (rd->json_output) { +jsonw_string (rd->jw,dev_caps_to_str (idx)); + }else { +pr_out ("%s" ,dev_caps_to_str (idx)); +if (caps >>0x1 ) +pr_out (", " ); + } } caps >>=0x1 ; } -pr_out (">" ); +if (rd->json_output) +jsonw_end_array (rd->jw); +else +pr_out (">" ); } -static void dev_print_fw (struct nlattr **tb) +static void dev_print_fw (struct rd *rd,struct nlattr **tb) { +const char *str;if (!tb[RDMA_NLDEV_ATTR_FW_VERSION ])return ; -pr_out ("fw %s " , -mnl_attr_get_str (tb[RDMA_NLDEV_ATTR_FW_VERSION ])); + str =mnl_attr_get_str (tb[RDMA_NLDEV_ATTR_FW_VERSION ]); +if (rd->json_output) +jsonw_string_field (rd->jw,"fw" , str); +else +pr_out ("fw %s " , str); } -static void dev_print_node_guid (struct nlattr **tb) +static void dev_print_node_guid (struct rd *rd,struct nlattr **tb) {uint64_t node_guid; +uint16_t vp[4 ]; +char str[32 ];if (!tb[RDMA_NLDEV_ATTR_NODE_GUID ])return ; node_guid =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_NODE_GUID ]); -rd_print_u64 ("node_guid" , node_guid); +memcpy (vp, &node_guid,sizeof (uint64_t )); +snprintf (str,32 ,"%04x:%04x:%04x:%04x" , vp[3 ], vp[2 ], vp[1 ], vp[0 ]); +if (rd->json_output) +jsonw_string_field (rd->jw,"node_guid" , str); +else +pr_out ("node_guid %s " , str); } -static void dev_print_sys_image_guid (struct nlattr **tb) +static void dev_print_sys_image_guid (struct rd *rd,struct nlattr **tb) {uint64_t sys_image_guid; +uint16_t vp[4 ]; +char str[32 ];if (!tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID ])return ; sys_image_guid =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID ]); -rd_print_u64 ("sys_image_guid" , sys_image_guid); +memcpy (vp, &sys_image_guid,sizeof (uint64_t )); +snprintf (str,32 ,"%04x:%04x:%04x:%04x" , vp[3 ], vp[2 ], vp[1 ], vp[0 ]); +if (rd->json_output) +jsonw_string_field (rd->jw,"sys_image_guid" , str); +else +pr_out ("sys_image_guid %s " , str); }static const char *node_type_to_str (uint8_t node_type)
@@ -131,37 +161,51 @@ static const char *node_type_to_str(uint8_t node_type)return "unknown" ; } -static void dev_print_node_type (struct nlattr **tb) +static void dev_print_node_type (struct rd *rd,struct nlattr **tb) { +const char *node_str;uint8_t node_type;if (!tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE ])return ; node_type =mnl_attr_get_u8 (tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE ]); -pr_out ("node_type %s " ,node_type_to_str (node_type)); + node_str =node_type_to_str (node_type); +if (rd->json_output) +jsonw_string_field (rd->jw,"node_type" , node_str); +else +pr_out ("node_type %s " , node_str); }static int dev_parse_cb (const struct nlmsghdr *nlh,void *data) {struct nlattr *tb[RDMA_NLDEV_ATTR_MAX ] = {};struct rd *rd = data; +const char *name; +uint32_t idx;mnl_attr_parse (nlh,0 , rd_attr_cb, tb);if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX ] || !tb[RDMA_NLDEV_ATTR_DEV_NAME ])return MNL_CB_ERROR ; -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); + idx =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); + name =mnl_attr_get_str (tb[RDMA_NLDEV_ATTR_DEV_NAME ]); +if (rd->json_output) { +jsonw_uint_field (rd->jw,"ifindex" , idx); +jsonw_string_field (rd->jw,"ifname" , name); + }else { +pr_out ("%u: %s: " , idx, name); + } + +dev_print_node_type (rd, tb); +dev_print_fw (rd, tb); +dev_print_node_guid (rd, tb); +dev_print_sys_image_guid (rd, tb);if (rd->show_details) -dev_print_caps (tb); +dev_print_caps (rd, tb); -pr_out ("\n" ); +if (!rd->json_output) +pr_out ("\n" );return MNL_CB_OK ; }
@@ -177,7 +221,12 @@ static int dev_no_args(struct rd *rd)if (ret)return ret; -return rd_recv_msg (rd, dev_parse_cb, rd, seq); +if (rd->json_output) +jsonw_start_object (rd->jw); + ret =rd_recv_msg (rd, dev_parse_cb, rd, seq); +if (rd->json_output) +jsonw_end_object (rd->jw); +return ret; }static int dev_one_show (struct rd *rd)
@@ -195,24 +244,29 @@ static int dev_show(struct rd *rd)struct dev_map *dev_map;int ret =0 ; +if (rd->json_output) +jsonw_start_array (rd->jw);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; + goto out; } - }else { dev_map =dev_map_lookup (rd, false);if (!dev_map) {pr_err ("Wrong device name\n" ); -return -ENOENT ; + ret = -ENOENT ; + goto out; }rd_arg_inc (rd); rd->dev_idx = dev_map->idx; ret =dev_one_show (rd); } +out: +if (rd->json_output) +jsonw_end_array (rd->jw);return ret; }
Signature · 1 line
2.14.1
PATCH v6 7/8 rdma: Add json output to link object
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
An example for the JSON output for two devices system.
root@mtr-leonro:~# rdma link -d -p -j
[{
"ifindex": 1,
"port": 1,
"ifname": "mlx5_0/1",
"subnet_prefix": "fe80:0000:0000:0000",
"lid": 13399,
"sm_lid": 49151,
"lmc": 0,
"state": "ACTIVE",
"physical_state": "LINK_UP",
"caps": ["AUTO_MIG"
]
},{
"ifindex": 2,
"port": 1,
"ifname": "mlx5_1/1",
"subnet_prefix": "fe80:0000:0000:0000",
"lid": 13400,
"sm_lid": 49151,
"lmc": 0,
"state": "ACTIVE",
"physical_state": "LINK_UP",
"caps": ["AUTO_MIG"
]
}
]--- rdma/link.c | 144 +++++++++++++++++++++++++++++++++++++++++++---------------- rdma/rdma.h | 1 - rdma/utils.c | 8 ---- 3 files changed, 105 insertions(+), 48 deletions(-)
rdma/link.c +105 -39
@@ -56,7 +56,7 @@ static const char *caps_to_str(uint32_t idx)return "UNKNOWN" ; } -static void link_print_caps (struct nlattr **tb) +static void link_print_caps (struct rd *rd,struct nlattr **tb) {uint64_t caps;uint32_t idx;
@@ -66,54 +66,89 @@ static void link_print_caps(struct nlattr **tb) caps =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_CAP_FLAGS ]); -pr_out ("\n caps: <" ); +if (rd->json_output) { +jsonw_name (rd->jw,"caps" ); +jsonw_start_array (rd->jw); + }else { +pr_out ("\n caps: <" ); + }for (idx =0 ; caps; idx++) {if (caps &0x1 ) { -pr_out ("%s" ,caps_to_str (idx)); -if (caps >>0x1 ) -pr_out (", " ); +if (rd->json_output) { +jsonw_string (rd->jw,caps_to_str (idx)); + }else { +pr_out ("%s" ,caps_to_str (idx)); +if (caps >>0x1 ) +pr_out (", " ); + } } caps >>=0x1 ; } -pr_out (">" ); +if (rd->json_output) +jsonw_end_array (rd->jw); +else +pr_out (">" ); } -static void link_print_subnet_prefix (struct nlattr **tb) +static void link_print_subnet_prefix (struct rd *rd,struct nlattr **tb) {uint64_t subnet_prefix; +uint16_t vp[4 ]; +char str[32 ];if (!tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX ])return ; subnet_prefix =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX ]); -rd_print_u64 ("subnet_prefix" , subnet_prefix); +memcpy (vp, &subnet_prefix,sizeof (uint64_t )); +snprintf (str,32 ,"%04x:%04x:%04x:%04x" , vp[3 ], vp[2 ], vp[1 ], vp[0 ]); +if (rd->json_output) +jsonw_string_field (rd->jw,"subnet_prefix" , str); +else +pr_out ("subnet_prefix %s " , str); } -static void link_print_lid (struct nlattr **tb) +static void link_print_lid (struct rd *rd,struct nlattr **tb) { +uint32_t lid; +if (!tb[RDMA_NLDEV_ATTR_LID ])return ; -pr_out ("lid %u " , -mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_LID ])); + lid =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_LID ]); +if (rd->json_output) +jsonw_uint_field (rd->jw,"lid" , lid); +else +pr_out ("lid %u " , lid); } -static void link_print_sm_lid (struct nlattr **tb) +static void link_print_sm_lid (struct rd *rd,struct nlattr **tb) { +uint32_t sm_lid; +if (!tb[RDMA_NLDEV_ATTR_SM_LID ])return ; -pr_out ("sm_lid %u " , -mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_SM_LID ])); + sm_lid =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_SM_LID ]); +if (rd->json_output) +jsonw_uint_field (rd->jw,"sm_lid" , sm_lid); +else +pr_out ("sm_lid %u " , sm_lid); } -static void link_print_lmc (struct nlattr **tb) +static void link_print_lmc (struct rd *rd,struct nlattr **tb) { +uint8_t lmc; +if (!tb[RDMA_NLDEV_ATTR_LMC ])return ; -pr_out ("lmc %u " ,mnl_attr_get_u8 (tb[RDMA_NLDEV_ATTR_LMC ])); + lmc =mnl_attr_get_u8 (tb[RDMA_NLDEV_ATTR_LMC ]); +if (rd->json_output) +jsonw_uint_field (rd->jw,"lmc" , lmc); +else +pr_out ("lmc %u " , lmc); }static const char *link_state_to_str (uint8_t link_state)
@@ -127,7 +162,7 @@ static const char *link_state_to_str(uint8_t link_state)return "UNKNOWN" ; } -static void link_print_state (struct nlattr **tb) +static void link_print_state (struct rd *rd,struct nlattr **tb) {uint8_t state;
@@ -135,7 +170,10 @@ static void link_print_state(struct nlattr **tb)return ; state =mnl_attr_get_u8 (tb[RDMA_NLDEV_ATTR_PORT_STATE ]); -pr_out ("state %s " ,link_state_to_str (state)); +if (rd->json_output) +jsonw_string_field (rd->jw,"state" ,link_state_to_str (state)); +else +pr_out ("state %s " ,link_state_to_str (state)); }static const char *phys_state_to_str (uint8_t phys_state)
@@ -152,7 +190,7 @@ static const char *phys_state_to_str(uint8_t phys_state)return "UNKNOWN" ; }; -static void link_print_phys_state (struct nlattr **tb) +static void link_print_phys_state (struct rd *rd,struct nlattr **tb) {uint8_t phys_state;
@@ -160,13 +198,19 @@ static void link_print_phys_state(struct nlattr **tb)return ; phys_state =mnl_attr_get_u8 (tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE ]); -pr_out ("physical_state %s " ,phys_state_to_str (phys_state)); +if (rd->json_output) +jsonw_string_field (rd->jw,"physical_state" , +phys_state_to_str (phys_state)); +else +pr_out ("physical_state %s " ,phys_state_to_str (phys_state)); }static int link_parse_cb (const struct nlmsghdr *nlh,void *data) {struct nlattr *tb[RDMA_NLDEV_ATTR_MAX ] = {};struct rd *rd = data; +uint32_t port, idx; +char name[32 ];mnl_attr_parse (nlh,0 , rd_attr_cb, tb);if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX ] || !tb[RDMA_NLDEV_ATTR_DEV_NAME ])
@@ -177,21 +221,31 @@ static int link_parse_cb(const struct nlmsghdr *nlh, void *data)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); + idx =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); + port =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_PORT_INDEX ]); +snprintf (name,32 ,"%s/%u" , +mnl_attr_get_str (tb[RDMA_NLDEV_ATTR_DEV_NAME ]), port); + +if (rd->json_output) { +jsonw_uint_field (rd->jw,"ifindex" , idx); +jsonw_uint_field (rd->jw,"port" , port); +jsonw_string_field (rd->jw,"ifname" , name); + + }else { +pr_out ("%u/%u: %s: " , idx, port, name); + } + +link_print_subnet_prefix (rd, tb); +link_print_lid (rd, tb); +link_print_sm_lid (rd, tb); +link_print_lmc (rd, tb); +link_print_state (rd, tb); +link_print_phys_state (rd, tb);if (rd->show_details) -link_print_caps (tb); +link_print_caps (rd, tb); -pr_out ("\n" ); +if (!rd->json_output) +pr_out ("\n" );return MNL_CB_OK ; }
@@ -208,7 +262,12 @@ static int link_no_args(struct rd *rd)if (ret)return ret; -return rd_recv_msg (rd, link_parse_cb, rd, seq); +if (rd->json_output) +jsonw_start_object (rd->jw); + ret =rd_recv_msg (rd, link_parse_cb, rd, seq); +if (rd->json_output) +jsonw_end_object (rd->jw); +return ret; }static int link_one_show (struct rd *rd)
@@ -225,8 +284,10 @@ static int link_show(struct rd *rd) {struct dev_map *dev_map;uint32_t port; -int ret; +int ret =0 ; +if (rd->json_output) +jsonw_start_array (rd->jw);if (rd_no_arg (rd)) {list_for_each_entry (dev_map, &rd->dev_map_list, list) { rd->dev_idx = dev_map->idx;
@@ -234,7 +295,7 @@ static int link_show(struct rd *rd) rd->port_idx = port; ret =link_one_show (rd);if (ret) -return ret; + goto out; } }
@@ -243,7 +304,8 @@ static int link_show(struct rd *rd) port =get_port_from_argv (rd);if (!dev_map || port > dev_map->num_ports) {pr_err ("Wrong device name\n" ); -return -ENOENT ; + ret = -ENOENT ; + goto out; }rd_arg_inc (rd); rd->dev_idx = dev_map->idx;
@@ -251,7 +313,7 @@ static int link_show(struct rd *rd)for (; rd->port_idx < dev_map->num_ports +1 ; rd->port_idx++) { ret =link_one_show (rd);if (ret) -return ret; + goto out;if (port)/* * We got request to show link for devname
@@ -260,7 +322,11 @@ static int link_show(struct rd *rd)break ; } } -return 0 ; + +out: +if (rd->json_output) +jsonw_end_array (rd->jw); +return ret; }int cmd_link (struct rd *rd)
rdma/rdma.h +0 -1
@@ -66,7 +66,6 @@ void rd_arg_inc(struct rd *rd);char *rd_argv (struct rd *rd);uint32_t get_port_from_argv (struct rd *rd); -void rd_print_u64 (char *name,uint64_t val);/* * Commands interface */
rdma/utils.c +0 -8
@@ -59,14 +59,6 @@ uint32_t get_port_from_argv(struct rd *rd)return slash ?atoi (slash +1 ) :0 ; } -void rd_print_u64 (char *name,uint64_t val) -{ -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 struct dev_map *dev_map_alloc (const char *dev_name) {struct dev_map *dev_map;
Signature · 1 line
2.14.1
PATCH v6 8/8 rdma: Add initial manual for the tool
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
--- man/man8/rdma-dev.8 | 55 +++++++++++++++++++++++++++ man/man8/rdma-link.8 | 55 +++++++++++++++++++++++++++ man/man8/rdma.8 | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 man/man8/rdma-dev.8 create mode 100644 man/man8/rdma-link.8 create mode 100644 man/man8/rdma.8
man/man8/rdma-dev.8 new file +55 -0
@@ -0,0 +1,55 @@ +.TH RDMA\-DEV 8 "06 Jul 2017" "iproute2" "Linux" +.SH NAME +rdmak-dev \- RDMA device configuration +.SH SYNOPSIS +.sp +.ad l +.in +8 +.ti -8 +.B rdma +.RI "[ " OPTIONS " ]" +.B dev +.RI " { " COMMAND " | " +.BR help " }" +.sp + +.ti -8 +.IR OPTIONS " := { " +\fB\-V\fR[\fIersion\fR] | +\fB\-d\fR[\fIetails\fR] } + +.ti -8 +.B rdma dev show +.RI "[ " DEV " ]" + +.ti -8 +.B rdma dev help + +.SH "DESCRIPTION" +.SS rdma dev show - display rdma device attributes + +.PP +.I "DEV" +- specifies the RDMA device to show. +If this argument is omitted all devices are listed. + +.SH "EXAMPLES" +.PP +rdma dev +.RS 4 +Shows the state of all RDMA devices on the system. +.RE +.PP +rdma dev show mlx5_3 +.RS 4 +Shows the state of specified RDMA device. +.RE +.PP + +.SH SEE ALSO +.BR rdma (8), +.BR rdma-link (8), +.br + +.SH AUTHOR +Leon Romanovsky <[email protected]>
man/man8/rdma-link.8 new file +55 -0
55 lines not on this page · raw message
man/man8/rdma.8 new file +102 -0
102 lines not on this page · raw message
Signature · 1 line
2.14.1
Stephen Hemminger
AppliedQuoted 193 lines · On Sun, 20 Aug 2017 12:58:20 +0300 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
This is fifth revision of series implementing the RDAMtool - the tool to configure RDMA devices.
It looks like everyone who was interested to read cover letter already did it, so I'll start from the changelog:
Changelog:
v5->v6:
* Removed double includes
* Copiedrdma_netlink.hfrom he kernel toinclude/rdmafolder, so the tool can be built as a standalone.v4->v5:
* Rebased to latest net-next branch
* MovedBIT()macro from devlink to generalutils.hfile - Patch #1.
* Changed the order of patches - moved man pages to be last patch.
* Rewrote allswitch->case->return_stringconstructions to be static tables with help of David's macro magic. Thanks a lot.
* Dropped dependency on exported device and port properties. Now tool depends on RDMA netlink only and all needed code is already in Doug's for-next.
* Added two OPA specific physical link states, because their names is too broad - TEST and OFFLINE, I named it asOPA_TESTandOPA_OFFLINE.v3->v4:
* Rebased to latest net-next branch
* Added JSON output -j (json) and -p (pretty output)
* Exported and reused kernel UAPIs and defines instead of hard coded version.v2->v3:
* RemovedMAX()
* Reduced scope ofrd_argv_match
* Removed return fromrdma_free_devmap
* Added extra break atrdma_send_msgv1->v2:
* Squashed multiple (and similar) patches to be one patch for dev object and one patch for link object.
* Removedport_mapstruct
* 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 forgottenCAP_FLAGSto thenla_policylistRFC->v0:
* Removed everything that is not implemented yet.
* Abandoned sysfs interfaces in favor of netlink.-----
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 Doug's for-next tag includes most of the needed patches for this tool.
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] | -j[son] | -p[retty]}### With unspecified device name
$ rdma dev 1: mlx5_0: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:3457 sys_image_guid 5254:00c0:fe12:3457 2: mlx5_1: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:3458 sys_image_guid 5254:00c0:fe12:3458 3: mlx5_2: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:3459 sys_image_guid 5254:00c0:fe12:3459 4: mlx5_3: node_type ca fw 2.8.9999 node_guid 5254:00c0:fe12:345a sys_image_guid 5254:00c0:fe12:345a 5: mlx5_4: node_type ca 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 ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR> 2: mlx5_1: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR> 3: mlx5_2: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR> 4: mlx5_3: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR> 5: mlx5_4: node_type ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>### Specific device
$ rdma dev show mlx5_4 5: mlx5_4: node_type ca 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 ca 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_POR, 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, MANAGED_FLOW_STEERING, RESIZE_MAX_WR>### 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'.Available in the "topic/rdmatool-netlink-v6" topic branch of this git repo:
git://git.kernel.org/pub/scm/linux/kernel/git/leon/iproute2.gitOr for browsing:
https://git.kernel.org/cgit/linux/kernel/git/leon/iproute2.git/log/?h=topic/rdmatool-netlink-v6Thanks
[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 Dennis Dalessandro <[email protected]>Cc Jason Gunthorpe <[email protected]>Cc Jiri Pirko <[email protected]>Cc Ariel Almog <[email protected]>Cc David Laight <[email protected]>Cc Linux Netdev <[email protected]>Leon Romanovsky (8):
utils: Move BIT macro to common header
rdma: Add basic infrastructure for RDMA tool
rdma: Add dev object
rdma: Add link object
rdma: Add json and pretty outputs
rdma: Implement json output for dev object
rdma: Add json output to link object
rdma: Add initial manual for the toolMakefile | 2 +- devlink/devlink.c | 2 +- include/rdma/rdma_netlink.h | 307 +++++++++++++++++++++++++++++++++++++++ include/utils.h | 2 + man/man8/rdma-dev.8 | 55 +++++++ man/man8/rdma-link.8 | 55 +++++++ man/man8/rdma.8 | 102 +++++++++++++ rdma/.gitignore | 1 + rdma/Makefile | 22 +++ rdma/dev.c | 284 ++++++++++++++++++++++++++++++++++++ rdma/link.c | 343 ++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 143 ++++++++++++++++++ rdma/rdma.h | 91 ++++++++++++ rdma/utils.c | 266 ++++++++++++++++++++++++++++++++++ 14 files changed, 1673 insertions(+), 2 deletions(-) create mode 100644 include/rdma/rdma_netlink.h create mode 100644 man/man8/rdma-dev.8 create mode 100644 man/man8/rdma-link.8
Quoted 8 lines
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
Applied to master branch (for 4.13).
Thanks for your patience and persistance.