From: Leon Romanovsky <hidden> Date: 2017-07-04 07:55:37
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 <redacted>
Cc: Ariel Almog <ariela-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
Cc: Linux RDMA <redacted>
Cc: Linux Netdev <redacted>
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 majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Leon Romanovsky <leon@kernel.org> Date: 2017-07-04 07:55:48
From: Leon Romanovsky <redacted>
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.
Signed-off-by: Leon Romanovsky <redacted>
---
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
@@ -0,0 +1,223 @@+/*+*utils.cRDMAtool+*+*Thisprogramisfreesoftware;youcanredistributeitand/or+*modifyitunderthetermsoftheGNUGeneralPublicLicense+*aspublishedbytheFreeSoftwareFoundation;eitherversion+*2oftheLicense,or(atyouroption)anylaterversion.+*+*Authors:LeonRomanovsky<leonro@mellanox.com>+*/++#include<sys/types.h>+#include<dirent.h>+#include<time.h>++#include"rdma.h"+#include<rdma/rdma_netlink.h>++staticintrd_argc(structrdma*rd)+{+returnrd->argc;+}++staticchar*rd_argv(structrdma*rd)+{+if(!rd_argc(rd))+returnNULL;+return*rd->argv;+}++staticintstrcmpx(constchar*str1,constchar*str2)+{+if(strlen(str1)>strlen(str2))+return-1;+returnstrncmp(str1,str2,strlen(str1));+}++staticboolrd_argv_match(structrdma*rd,constchar*pattern)+{+if(!rd_argc(rd))+returnfalse;+returnstrcmpx(rd_argv(rd),pattern)==0;+}++voidrd_arg_inc(structrdma*rd)+{+if(!rd_argc(rd))+return;+rd->argc--;+rd->argv++;+}++boolrd_no_arg(structrdma*rd)+{+returnrd_argc(rd)==0;+}++staticstructdev_map*dev_map_alloc(constchar*dev_name)+{+structdev_map*dev_map;++dev_map=calloc(1,sizeof(*dev_map));+if(!dev_map)+returnNULL;+dev_map->dev_name=strdup(dev_name);++returndev_map;+}++staticvoiddev_map_free(structdev_map*dev_map)+{+if(!dev_map)+return;++free(dev_map->dev_name);+free(dev_map);+}++staticvoiddev_map_cleanup(structrdma*rd)+{+structdev_map*dev_map,*tmp;++list_for_each_entry_safe(dev_map,tmp,+&rd->dev_map_list,list){+list_del(&dev_map->list);+dev_map_free(dev_map);+}+}++staticconstenummnl_attr_data_typenldev_policy[RDMA_NLDEV_ATTR_MAX]={+[RDMA_NLDEV_ATTR_DEV_NAME]=MNL_TYPE_NUL_STRING,+[RDMA_NLDEV_ATTR_PORT_INDEX]=MNL_TYPE_U32,+};++intrd_attr_cb(conststructnlattr*attr,void*data)+{+conststructnlattr**tb=data;+inttype;++if(mnl_attr_type_valid(attr,RDMA_NLDEV_ATTR_MAX)<0)+returnMNL_CB_ERROR;++type=mnl_attr_get_type(attr);++if(mnl_attr_validate(attr,nldev_policy[type])<0)+returnMNL_CB_ERROR;++tb[type]=attr;+returnMNL_CB_OK;+}++intrd_dev_init_cb(conststructnlmsghdr*nlh,void*data)+{+structnlattr*tb[RDMA_NLDEV_ATTR_MAX]={};+structdev_map*dev_map;+structrdma*rd=data;+constchar*dev_name;++mnl_attr_parse(nlh,0,rd_attr_cb,tb);+if(!tb[RDMA_NLDEV_ATTR_DEV_NAME]||!tb[RDMA_NLDEV_ATTR_DEV_INDEX])+returnMNL_CB_ERROR;+if(!tb[RDMA_NLDEV_ATTR_PORT_INDEX]){+pr_err("This tool doesn't support switches yet\n");+returnMNL_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 */+returnMNL_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]);++returnMNL_CB_OK;+}++voidrdma_free_devmap(structrdma*rd)+{+if(!rd)+return;+dev_map_cleanup(rd);+}++intrdma_exec_cmd(structrdma*rd,conststructrdma_cmd*cmds,constchar*str)+{+conststructrdma_cmd*c;++/* First argument in objs table is default variant */+if(rd_no_arg(rd))+returncmds->func(rd);++for(c=cmds+1;c->cmd;++c){+if(rd_argv_match(rd,c->cmd)){+/* Move to next argument */+rd_arg_inc(rd);+returnc->func(rd);+}+}++pr_err("Unknown %s '%s'.\n",str,rd_argv(rd));+return0;+}++voidrdma_prepare_msg(structrdma*rd,uint32_tcmd,uint32_t*seq,uint16_tflags)+{+*seq=time(NULL);++rd->nlh=mnl_nlmsg_put_header(rd->buff);+rd->nlh->nlmsg_type=RDMA_NL_GET_TYPE(RDMA_NL_NLDEV,cmd);+rd->nlh->nlmsg_seq=*seq;+rd->nlh->nlmsg_flags=flags;+}++intrdma_send_msg(structrdma*rd)+{+intret;++rd->nl=mnl_socket_open(NETLINK_RDMA);+if(!rd->nl){+pr_err("Failed to open NETLINK_RDMA socket\n");+return-ENODEV;+}++ret=mnl_socket_bind(rd->nl,0,MNL_SOCKET_AUTOPID);+if(ret<0){+pr_err("Failed to bind socket with err %d\n",ret);+gotoerr;+}++ret=mnl_socket_sendto(rd->nl,rd->nlh,rd->nlh->nlmsg_len);+if(ret<0){+pr_err("Failed to send to socket with err %d\n",ret);+gotoerr;+}+return0;++err:+mnl_socket_close(rd->nl);+returnret;+}++intrdma_recv_msg(structrdma*rd,mnl_cb_tcallback,void*data,unsignedintseq)+{+intret;+unsignedintportid;+charbuf[MNL_SOCKET_BUFFER_SIZE];++portid=mnl_socket_get_portid(rd->nl);+do{+ret=mnl_socket_recvfrom(rd->nl,buf,sizeof(buf));+if(ret<=0)+break;++ret=mnl_cb_run(buf,ret,seq,portid,callback,data);+}while(ret>0);++mnl_socket_close(rd->nl);+returnret;+}
@@ -21,7 +21,7 @@ static int rd_argc(struct rdma *rd)returnrd->argc;}-staticchar*rd_argv(structrdma*rd)+char*rd_argv(structrdma*rd){if(!rd_argc(rd))returnNULL;
@@ -55,6 +55,15 @@ bool rd_no_arg(struct rdma *rd)returnrd_argc(rd)==0;}+uint32_tget_port_from_argv(structrdma*rd)+{+char*slash;++slash=strchr(rd_argv(rd),'/');+/* if no port found, return 0 */+return(slash)?(atoi(slash+1)):0;+}+staticstructdev_map*dev_map_alloc(constchar*dev_name){structdev_map*dev_map;
From: Leon Romanovsky <hidden> Date: 2017-07-04 09:04:49
On Tue, Jul 04, 2017 at 10:55:39AM +0300, Leon Romanovsky wrote:
From: Leon Romanovsky <redacted>
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
Signed-off-by: Leon Romanovsky <redacted>
---
Tue, Jul 04, 2017 at 09:55:37AM CEST, leon@kernel.org wrote:
Hi,
This is third version of series implementing the RDAMtool - the tool
s/RDAMtool/RDMAtool/
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]}
Tue, Jul 04, 2017 at 09:55:38AM CEST, leon@kernel.org wrote:
From: Leon Romanovsky <redacted>
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.
Signed-off-by: Leon Romanovsky <redacted>
@@ -0,0 +1,280 @@+/*+*link.cRDMAtool+*+*Thisprogramisfreesoftware;youcanredistributeitand/or+*modifyitunderthetermsoftheGNUGeneralPublicLicense+*aspublishedbytheFreeSoftwareFoundation;eitherversion+*2oftheLicense,or(atyouroption)anylaterversion.+*+*Authors:LeonRomanovsky<leonro@mellanox.com>+*/++#include"rdma.h"++staticintlink_help(structrdma*rd)+{+pr_out("Usage: %s link show [DEV/PORT_INDEX]\n",rd->filename);+return0;+}++staticvoidlink_print_caps(structnlattr**tb)+{+uint64_tcaps;+uint32_tidx;++/*+*FIXME:movetoindexeswhenkernelwillstartexportingthem.
+}
+
+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);
+ 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"
+ for (; port < dev_map->num_ports + 1; port++, rd->port_idx++) {
+ ret = link_one_show(rd);
+ if (ret)
+ return ret;
+ 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.
[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 majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
@@ -0,0 +1,280 @@+/*+*link.cRDMAtool+*+*Thisprogramisfreesoftware;youcanredistributeitand/or+*modifyitunderthetermsoftheGNUGeneralPublicLicense+*aspublishedbytheFreeSoftwareFoundation;eitherversion+*2oftheLicense,or(atyouroption)anylaterversion.+*+*Authors:LeonRomanovsky<leonro@mellanox.com>+*/++#include"rdma.h"++staticintlink_help(structrdma*rd)+{+pr_out("Usage: %s link show [DEV/PORT_INDEX]\n",rd->filename);+return0;+}++staticvoidlink_print_caps(structnlattr**tb)+{+uint64_tcaps;+uint32_tidx;++/*+*FIXME:movetoindexeswhenkernelwillstartexportingthem.
Not exported yet?
Not yet, I want to minimize the UAPI export from kernel before user-space
part is accepted.
quoted
+ */
+ 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).
+ for (; port < dev_map->num_ports + 1; port++, rd->port_idx++) {
+ ret = link_one_show(rd);
+ if (ret)
+ return ret;
+ 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.
[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 majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
@@ -0,0 +1,280 @@+/*+*link.cRDMAtool+*+*Thisprogramisfreesoftware;youcanredistributeitand/or+*modifyitunderthetermsoftheGNUGeneralPublicLicense+*aspublishedbytheFreeSoftwareFoundation;eitherversion+*2oftheLicense,or(atyouroption)anylaterversion.+*+*Authors:LeonRomanovsky<leonro@mellanox.com>+*/++#include"rdma.h"++staticintlink_help(structrdma*rd)+{+pr_out("Usage: %s link show [DEV/PORT_INDEX]\n",rd->filename);+return0;+}++staticvoidlink_print_caps(structnlattr**tb)+{+uint64_tcaps;+uint32_tidx;++/*+*FIXME:movetoindexeswhenkernelwillstartexportingthem.
Not exported yet?
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?
[...]
@@ -0,0 +1,280 @@+/*+*link.cRDMAtool+*+*Thisprogramisfreesoftware;youcanredistributeitand/or+*modifyitunderthetermsoftheGNUGeneralPublicLicense+*aspublishedbytheFreeSoftwareFoundation;eitherversion+*2oftheLicense,or(atyouroption)anylaterversion.+*+*Authors:LeonRomanovsky<leonro@mellanox.com>+*/++#include"rdma.h"++staticintlink_help(structrdma*rd)+{+pr_out("Usage: %s link show [DEV/PORT_INDEX]\n",rd->filename);+return0;+}++staticvoidlink_print_caps(structnlattr**tb)+{+uint64_tcaps;+uint32_tidx;++/*+*FIXME:movetoindexeswhenkernelwillstartexportingthem.
Not exported yet?
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
From: Leon Romanovsky <hidden> Date: 2017-07-11 07:09:48
On Mon, Jul 10, 2017 at 09:43:25AM +0200, Jiri Pirko wrote:
Tue, Jul 04, 2017 at 09:55:37AM CEST, leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org wrote:
quoted
Hi,
This is third version of series implementing the RDAMtool - the tool
s/RDAMtool/RDMAtool/
quoted
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]}
From: Leon Romanovsky <hidden> Date: 2017-07-11 07:23:14
On Mon, Jul 10, 2017 at 09:47:17AM +0200, Jiri Pirko wrote:
Tue, Jul 04, 2017 at 09:55:38AM CEST, leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org wrote:
quoted
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
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.
Signed-off-by: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>