RDMAtool
Subsystems (4)
cover RDMAtool
From: Leon Romanovsky <[email protected]>
Hi,
This is second version of series implementing the RDAMtool - the tool to configure RDMA devices. The initial proposal was sent as RFC [1] and was based on sysfs entries as POC.
The current series was rewritten completely to work with RDMA netlinks as a source of user<->kernel communications. In order to achieve that, the RDMA netlinks were extensively refactored and modernized [2, 3, 4 and 5].
Changelogv0->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.
Available in the "topic/rdmatool-netlink-v1" topic branch of this git repo:git://git.kernel.org/pub/scm/linux/kernel/git/leon/iproute2.git
Or for browsing:
https://git.kernel.org/cgit/linux/kernel/git/leon/iproute2.git/log/?h=topic/rdmatool-netlink-v1
Thanks
[1] https://www.spinics.net/lists/linux-rdma/msg49575.html
[2] https://patchwork.kernel.org/patch/9752865/
[3] https://www.spinics.net/lists/linux-rdma/msg50827.html
[4] https://www.spinics.net/lists/linux-rdma/msg51210.html
[5] https://patchwork.kernel.org/patch/9811729/ and https://patchwork.kernel.org/patch/9811731/]
Leon Romanovsky (6):
rdma: Add basic infrastructure for RDMA tool
rdma: Add dev object
rdma: Add device capability parsing
rdma: Add link option and parsing
rdma: Add FW version to the device output
rdma: Add initial manual for the tool
Makefile | 2 +- man/man8/Makefile | 3 +- man/man8/rdma.8 | 82 ++++++++++++++ rdma/.gitignore | 1 + rdma/Makefile | 22 ++++ rdma/dev.c | 145 +++++++++++++++++++++++++ rdma/link.c | 202 +++++++++++++++++++++++++++++++++++ rdma/rdma.c | 112 ++++++++++++++++++++ rdma/rdma.h | 90 ++++++++++++++++ rdma/utils.c | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 969 insertions(+), 2 deletions(-) create mode 100644 man/man8/rdma.8 create mode 100644 rdma/.gitignore create mode 100644 rdma/Makefile create mode 100644 rdma/dev.c create mode 100644 rdma/link.c create mode 100644 rdma/rdma.c create mode 100644 rdma/rdma.h create mode 100644 rdma/utils.c
PATCH 1/6 rdma: Add basic infrastructure for RDMA tool
From: Leon Romanovsky <[email protected]>
RDMA devices are cross-functional devices from one side, but very tailored for the specific markets from another.
Such diversity caused to spread of RDMA related configuration across various tools, e.g. devlink, ip, ethtool, ib specific and vendor specific solutions.
This patch adds ability to fill device and port information by reading RDMA netlink.
--- Makefile | 2 +- rdma/.gitignore | 1 + rdma/Makefile | 22 +++++ rdma/rdma.c | 110 +++++++++++++++++++++++ rdma/rdma.h | 76 ++++++++++++++++ rdma/utils.c | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 480 insertions(+), 1 deletion(-) create mode 100644 rdma/.gitignore create mode 100644 rdma/Makefile create mode 100644 rdma/rdma.c create mode 100644 rdma/rdma.h create mode 100644 rdma/utils.c
Makefile +1 -1
@@ -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
@@ -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 +110 -0
110 lines not on this page · raw message
rdma/rdma.h new file +76 -0
76 lines not on this page · raw message
rdma/utils.c new file +270 -0
270 lines not on this page · raw message
Signature · 1 line
2.13.1
PATCH 2/6 rdma: Add dev object
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Device (dev) object represents struct ib_device to user space.
The supported commands are show, set and help, but it doesn't print anything except device name at this stage. The downstream patches will fill this object with subcommands.
Print all devices:
# rdma dev 1: mlx5_0: 2: mlx5_1: 3: mlx5_2:
Print specific device:
# rdma dev show mlx5_1 2: mlx5_1:
--- rdma/Makefile | 2 +- rdma/dev.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 3 ++- rdma/rdma.h | 6 ++++++ rdma/utils.c | 39 ++++++++++++++++++++++++++++++++++----- 5 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 rdma/dev.c
rdma/Makefile +1 -1
@@ -2,7 +2,7 @@ include ../Config ifeq ($(HAVE_MNL),y) -RDMA_OBJ = rdma.o utils.o +RDMA_OBJ = rdma.o utils.o dev.o TARGETS=rdma CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
rdma/dev.c new file +55 -0
55 lines not on this page · raw message
rdma/rdma.c +2 -1
@@ -18,7 +18,7 @@static void help (char *name) {pr_out ("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n" -"where OBJECT := { help }\n" +"where OBJECT := { dev | help }\n" " OPTIONS := { -V[ersion] }\n" , name); }
@@ -33,6 +33,7 @@ static int rd_cmd(struct rdma *rd)const struct rdma_cmd cmds[] = { {NULL , cmd_help }, {"help" , cmd_help }, + {"dev" , cmd_dev }, {0 } };
rdma/rdma.h +6 -0
@@ -58,12 +58,18 @@ bool rd_no_arg(struct rdma *rd);bool rd_argv_match (struct rdma *rd,const char *pattern);void rd_arg_inc (struct rdma *rd); +/* +* Commands interface +*/ +int cmd_dev (struct rdma *rd);int rdma_exec_cmd (struct rdma *rd,const struct rdma_cmd *c,const char *str);/* * Device manipulation */ void rdma_free_devmap (struct rdma *rd); +struct dev_map *dev_map_lookup (struct rdma *rd,bool allow_port_index); +struct dev_map *_dev_map_lookup (struct rdma *rd,const char *dev_name);/* * Netlink
rdma/utils.c +34 -5
@@ -128,8 +128,10 @@ static int port_map_alloc(struct dev_map *dev_map, uint32_t num_ports) }static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX ] = { + [RDMA_NLDEV_ATTR_DEV_INDEX ] =MNL_TYPE_U32 , [RDMA_NLDEV_ATTR_DEV_NAME ] =MNL_TYPE_NUL_STRING , [RDMA_NLDEV_ATTR_PORT_INDEX ] =MNL_TYPE_U32 , + [RDMA_NLDEV_ATTR_CAP_FLAGS ] =MNL_TYPE_U64 , };int rd_attr_cb (const struct nlattr *attr,void *data)
@@ -156,10 +158,9 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data)struct rdma *rd = data;const char *dev_name;uint32_t num_ports; -static int i =1 ;mnl_attr_parse (nlh,0 , rd_attr_cb, tb); -if (!tb[RDMA_NLDEV_ATTR_DEV_NAME ]) +if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX ] || !tb[RDMA_NLDEV_ATTR_DEV_NAME ])return MNL_CB_ERROR ;if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX ]) {pr_err ("This tool doesn't support switches yet\n" );
@@ -167,18 +168,18 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data) } dev_name =mnl_attr_get_str (tb[RDMA_NLDEV_ATTR_DEV_NAME ]); - num_ports =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_PORT_INDEX ]); - dev_map =dev_map_alloc (dev_name);if (!dev_map)/* The main function will cleanup the allocations */ return MNL_CB_ERROR ;list_add_tail (&dev_map->list, &rd->dev_map_list); - dev_map->idx = i++; + num_ports =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_PORT_INDEX ]);if (port_map_alloc (dev_map, num_ports))return MNL_CB_ERROR ; dev_map->num_ports = num_ports; + dev_map->idx =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); + dev_map->caps =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_CAP_FLAGS ]);return MNL_CB_OK ; }
@@ -268,3 +269,31 @@ int rdma_recv_msg(struct rdma *rd, mnl_cb_t callback, void *data, unsigned int smnl_socket_close (rd->nl);return ret; } + +struct dev_map *_dev_map_lookup (struct rdma *rd,const char *dev_name) +{ +struct dev_map *dev_map; + +list_for_each_entry (dev_map, &rd->dev_map_list, list) +if (strcmp (dev_name, dev_map->dev_name) ==0 ) +return dev_map; + +return NULL ; +} +struct dev_map *dev_map_lookup (struct rdma *rd,bool allow_port_index) +{ +struct dev_map *dev_map; +char *dev_name; +char *slash; + + dev_name =strdup (rd_argv (rd)); +if (allow_port_index) { + slash =strrchr (dev_name,'/' ); +if (slash) + *slash ='\0' ; + } + + dev_map =_dev_map_lookup (rd, dev_name); +free (dev_name); +return dev_map; +}
Signature · 1 line
2.13.1
A message that is not in the archive (sent off-list or not yet received): 20170627143920.28020-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH 3/6 rdma: Add device capability parsing
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add parsing interface for the device capability flags
$ rdma dev show
1: mlx5_0:
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
2: mlx5_1:
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
3: mlx5_2:
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
4: mlx5_3:
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
5: mlx5_4:
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>
root@mtr-leonro:~#$ rdma dev show mlx5_4
5: mlx5_4:
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>--- rdma/dev.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- rdma/rdma.h | 3 ++ rdma/utils.c | 2 +- 3 files changed, 95 insertions(+), 9 deletions(-)
rdma/dev.c +91 -8
@@ -17,28 +17,111 @@ static int dev_help(struct rdma *rd)return 0 ; } -static void dev_one_show (const struct dev_map *dev_map) +static const char *dev_caps[64 ] = { +"RESIZE_MAX_WR" , +"BAD_PKEY_CNTR" , +"BAD_QKEY_CNTR" , +"RAW_MULTI" , +"AUTO_PATH_MIG" , +"CHANGE_PHY_PORT" , +"UD_AV_PORT_ENFORCE" , +"CURR_QP_STATE_MOD" , +"SHUTDOWN_PORT" , +"INIT_TYPE" , +"PORT_ACTIVE_EVENT" , +"SYS_IMAGE_GUID" , +"RC_RNR_NAK_GEN" , +"SRQ_RESIZE" , +"N_NOTIFY_CQ" , +"LOCAL_DMA_LKEY" , +"RESERVED" , +"MEM_WINDOW" , +"UD_IP_CSUM" , +"UD_TSO" , +"XRC" , +"MEM_MGT_EXTENSIONS" , +"BLOCK_MULTICAST_LOOPBACK" , +"MEM_WINDOW_TYPE_2A" , +"MEM_WINDOW_TYPE_2B" , +"RC_IP_CSUM" , +"RAW_IP_CSUM" , +"CROSS_CHANNEL" , +"MANAGED_FLOW_STEERING" , +"SIGNATURE_HANDOVER" , +"ON_DEMAND_PAGING" , +"SG_GAPS_REG" , +"VIRTUAL_FUNCTION" , +"RAW_SCATTER_FCS" , +"RDMA_NETDEV_OPA_VNIC" , +}; + +static int dev_print_caps (struct rdma *rd) { -pr_out ("%u: %s:\n" , dev_map->idx, dev_map->dev_name); +struct dev_map *dev_map = rd->dev_map_curr; +uint64_t caps = dev_map->caps; +bool found = false; +uint32_t idx; + +pr_out (" caps: <" ); +for (idx =0 ; idx <64 ; idx++) { +if (caps &0x1 ) { +pr_out ("%s" , dev_caps[idx]?dev_caps[idx]:"UNKNONW" ); +if (caps >>0x1 ) +pr_out (", " ); + found = true; + } + caps >>=0x1 ; + } +if (!found) +pr_out ("NONE" ); + +pr_out (">\n" ); +return 0 ; +} + +static int dev_no_args (struct rdma *rd) +{ +struct dev_map *dev_map = rd->dev_map_curr; + +pr_out ("%u: %s: \n" , dev_map->idx, dev_map->dev_name); +return dev_print_caps (rd); +} + +static int dev_one_show (struct rdma *rd) +{ +const struct rdma_cmd cmds[] = { + {NULL , dev_no_args}, + {0 } + }; + +return rdma_exec_cmd (rd, cmds,"parameter" ); + }static int dev_show (struct rdma *rd) {struct dev_map *dev_map; +int ret =0 ;if (rd_no_arg (rd)) { -list_for_each_entry (dev_map, &rd->dev_map_list, list) -dev_one_show (dev_map); +list_for_each_entry (dev_map, &rd->dev_map_list, list) { + rd->dev_map_curr = dev_map; + ret =dev_one_show (rd); +if (ret) +return ret; + } + }else { - dev_map =dev_map_lookup (rd, false); -if (!dev_map) { + rd->dev_map_curr =dev_map_lookup (rd, false); +if (!rd->dev_map_curr) {pr_err ("Wrong device name\n" );return -ENOENT ; } -dev_one_show (dev_map); +rd_arg_inc (rd); + ret =dev_one_show (rd); } -return 0 ; +return ret; }int cmd_dev (struct rdma *rd)
rdma/rdma.h +3 -0
@@ -34,6 +34,7 @@ struct dev_map {uint32_t num_ports;struct list_head port_map_list;uint32_t idx; +uint64_t caps; };struct rdma {
@@ -41,6 +42,7 @@ struct rdma {char **argv;char *filename;struct list_head dev_map_list; +struct dev_map *dev_map_curr;struct mnl_socket *nl;struct nlmsghdr *nlh;char *buff;
@@ -57,6 +59,7 @@ struct rdma_cmd {bool rd_no_arg (struct rdma *rd);bool rd_argv_match (struct rdma *rd,const char *pattern);void rd_arg_inc (struct rdma *rd); +char *rd_argv (struct rdma *rd);/* * Commands interface
rdma/utils.c +1 -1
@@ -28,7 +28,7 @@ static int rd_argc(struct rdma *rd)return rd->argc; } -static char *rd_argv (struct rdma *rd) +char *rd_argv (struct rdma *rd) {if (!rd_argc (rd))return NULL ;
Signature · 6 lines
2.13.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170627143920.28020-4-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing
Quoted 27 lines · On Tue, 27 Jun 2017 17:39:17 +0300 Leon Romanovsky…
rdma/dev.c +27
-0+static const char *dev_caps[64 ] = { +"RESIZE_MAX_WR" , +"BAD_PKEY_CNTR" , +"BAD_QKEY_CNTR" , +"RAW_MULTI" , +"AUTO_PATH_MIG" , +"CHANGE_PHY_PORT" , +"UD_AV_PORT_ENFORCE" , +"CURR_QP_STATE_MOD" , +"SHUTDOWN_PORT" , +"INIT_TYPE" , +"PORT_ACTIVE_EVENT" , +"SYS_IMAGE_GUID" , +"RC_RNR_NAK_GEN" , +"SRQ_RESIZE" , +"N_NOTIFY_CQ" , +"LOCAL_DMA_LKEY" , +"RESERVED" , +"MEM_WINDOW" , +"UD_IP_CSUM" , +"UD_TSO" , +"XRC" , +"MEM_MGT_EXTENSIONS" , +"BLOCK_MULTICAST_LOOPBACK" , +"MEM_WINDOW_TYPE_2A" , +"MEM_WINDOW_TYPE_2B" , +"RC_IP_CSUM" ,
rdma/dev.c static int dev_help(struct rdma *rd) · line 56
Quoted 10 lines
rdma/dev.c +10
-0+"RAW_IP_CSUM" , +"CROSS_CHANNEL" , +"MANAGED_FLOW_STEERING" , +"SIGNATURE_HANDOVER" , +"ON_DEMAND_PAGING" , +"SG_GAPS_REG" , +"VIRTUAL_FUNCTION" , +"RAW_SCATTER_FCS" , + "RDMA_NETDEV_OPA_VNIC", +};
Please use array initializer so that header and capabilities don't get different values. Are the bit values in some rdma header file?
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing
Quoted 35 lines · Stephen Hemminger
Quoted 32 lines · On Tue, 27 Jun 2017 17:39:17 +0300 Leon Romanovsky…
rdma/dev.c +32
-0+static const char *dev_caps[64 ] = { +"RESIZE_MAX_WR" , +"BAD_PKEY_CNTR" , +"BAD_QKEY_CNTR" , +"RAW_MULTI" , +"AUTO_PATH_MIG" , +"CHANGE_PHY_PORT" , +"UD_AV_PORT_ENFORCE" , +"CURR_QP_STATE_MOD" , +"SHUTDOWN_PORT" , +"INIT_TYPE" , +"PORT_ACTIVE_EVENT" , +"SYS_IMAGE_GUID" , +"RC_RNR_NAK_GEN" , +"SRQ_RESIZE" , +"N_NOTIFY_CQ" , +"LOCAL_DMA_LKEY" , +"RESERVED" , +"MEM_WINDOW" , +"UD_IP_CSUM" , +"UD_TSO" , +"XRC" , +"MEM_MGT_EXTENSIONS" , +"BLOCK_MULTICAST_LOOPBACK" , +"MEM_WINDOW_TYPE_2A" , +"MEM_WINDOW_TYPE_2B" , +"RC_IP_CSUM" , +"RAW_IP_CSUM" , +"CROSS_CHANNEL" , +"MANAGED_FLOW_STEERING" , +"SIGNATURE_HANDOVER" , +"ON_DEMAND_PAGING" ,
Quoted 8 lines
rdma/dev.c static int dev_help(struct rdma *rd) · line 56
Quoted 5 lines
rdma/dev.c +5
-0+"SG_GAPS_REG" , +"VIRTUAL_FUNCTION" , +"RAW_SCATTER_FCS" , + "RDMA_NETDEV_OPA_VNIC", +};Please use array initializer so that header and capabilities don't get different values. Are the bit values in some rdma header file?
It is enum ib_device_cap_flags copied from include/rdma/ib_verbs.h. These enum ib_device_cap_flags and enum ib_port_cap_flags are not exposed to the user (include/uapi/rdma/*) and I'm planning to move them there in next cycle.
Thanks
PATCH 5/6 rdma: Add FW version to the device output
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
$ rdma dev show mlx5_4
5: mlx5_4: fw 2.8.9999
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, CHANGE_PHY_PORT, PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, UD_IP_CSUM, UD_TSO, XRC, MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B, RAW_IP_CSUM, SIGNATURE_HANDOVER, VIRTUAL_FUNCTION>--- rdma/dev.c | 9 ++++++++- rdma/rdma.h | 1 + rdma/utils.c | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-)
rdma/dev.c +8 -1
@@ -83,7 +83,14 @@ static int dev_no_args(struct rdma *rd) {struct dev_map *dev_map = rd->dev_map_curr; -pr_out ("%u: %s: \n" , dev_map->idx, dev_map->dev_name); +pr_out ("%u: %s: " , dev_map->idx, dev_map->dev_name); +if (strlen (dev_map->fw_version) <1 ) +/* +* if no FW, the return string from RDMA netlink is "\0" +*/ +pr_out ("fw NONE\n" ); +else +pr_out ("fw %s\n" , dev_map->fw_version);return dev_print_caps (rd); }
rdma/rdma.h +1 -0
@@ -36,6 +36,7 @@ struct dev_map {struct list_head port_map_list;uint32_t idx;uint64_t caps; +char *fw_version; };struct rdma {
rdma/utils.c +4 -0
@@ -104,6 +104,7 @@ static void dev_map_free(struct dev_map *dev_map)port_map_free (port_map); } +free (dev_map->fw_version);free (dev_map->dev_name);free (dev_map); }
@@ -141,6 +142,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING, [RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_CAP_FLAGS] = MNL_TYPE_U64, + [RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING, };int rd_attr_cb (const struct nlattr *attr,void *data)
@@ -190,6 +192,8 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data) dev_map->idx =mnl_attr_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); dev_map->caps =mnl_attr_get_u64 (tb[RDMA_NLDEV_ATTR_CAP_FLAGS ]); + dev_map->fw_version =strdup (mnl_attr_get_str (tb[RDMA_NLDEV_ATTR_FW_VERSION ])); +return MNL_CB_OK ; }
Signature · 6 lines
2.13.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 6/6 rdma: Add initial manual for the tool
In reply to a message not in the archiveFrom: 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
@@ -19,7 +19,8 @@ MAN8PAGES = $(TARGETS) ip.8 arpd.8 lnstat.8 routel.8 rtacct.8 rtmon.8 rtpr.8 ss. tc-simple.8 tc-skbedit.8 tc-vlan.8 tc-xt.8 tc-skbmod.8 tc-ife.8 \ tc-tunnel_key.8 tc-sample.8 \ devlink.8 devlink-dev.8 devlink-monitor.8 devlink-port.8 devlink-sb.8 \ - ifstat.8 + ifstat.8 \ + rdma.8 all: $(TARGETS)
man/man8/rdma.8 new file +82 -0
82 lines not on this page · raw message
Signature · 6 lines
2.13.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 4/6 rdma: Add link option and parsing
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Add link object interface together with port capability parsing command
$ rdma link
1/1: mlx5_0/1:
caps: <AUTO_MIGR>
2/1: mlx5_1/1:
caps: <AUTO_MIGR>
3/1: mlx5_2/1:
caps: <AUTO_MIGR>
4/1: mlx5_3/1:
caps: <CM, IP_BASED_GIDS>
5/1: mlx5_4/1:
caps: <AUTO_MIGR>$ rdma link show mlx5_4
5/1: mlx5_4/1:
caps: <AUTO_MIGR>--- rdma/Makefile | 2 +- rdma/link.c | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 1 + rdma/rdma.h | 4 ++ rdma/utils.c | 9 +++ 5 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 rdma/link.c
rdma/Makefile +1 -1
@@ -2,7 +2,7 @@ include ../Config ifeq ($(HAVE_MNL),y) -RDMA_OBJ = rdma.o utils.o dev.o +RDMA_OBJ = rdma.o utils.o dev.o link.o TARGETS=rdma CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
rdma/link.c new file +202 -0
202 lines not on this page · raw message
rdma/rdma.c +1 -0
@@ -34,6 +34,7 @@ static int rd_cmd(struct rdma *rd) { NULL, cmd_help }, { "help", cmd_help }, { "dev", cmd_dev }, + { "link", cmd_link }, { 0 } };
rdma/rdma.h +4 -0
@@ -26,6 +26,7 @@struct port_map {struct list_head list;uint32_t idx; +uint64_t caps; };struct dev_map {
@@ -43,6 +44,7 @@ struct rdma {char *filename;struct list_head dev_map_list;struct dev_map *dev_map_curr; +struct port_map *port_map_curr;struct mnl_socket *nl;struct nlmsghdr *nlh;char *buff;
@@ -60,11 +62,13 @@ bool rd_no_arg(struct rdma *rd);bool rd_argv_match (struct rdma *rd,const char *pattern);void rd_arg_inc (struct rdma *rd);char *rd_argv (struct rdma *rd); +uint32_t get_port_from_argv (struct rdma *rd);/* * Commands interface */ int cmd_dev (struct rdma *rd); +int cmd_link (struct rdma *rd);int rdma_exec_cmd (struct rdma *rd,const struct rdma_cmd *c,const char *str);/*
rdma/utils.c +9 -0
@@ -62,6 +62,15 @@ bool rd_no_arg(struct rdma *rd)return rd_argc (rd) ==0 ; } +uint32_t get_port_from_argv (struct rdma *rd) +{ +char *slash; + + slash =strchr (rd_argv (rd),'/' ); +/* if no port found, return 0 */ +return (slash) ? (atoi (slash +1 )):0 ; +} +static struct dev_map *dev_map_alloc (const char *dev_name) {struct dev_map *dev_map;
Signature · 1 line
2.13.1