RDMA Netlink Device Client
Subsystems (11)
v2 cover RDMA Netlink Device Client
Hi,
This is third version of the RDMA netlink patch set.
The following patch set is an implementation of NLDEV - RDMA netlink device client. It is based on the already sent patch [1] and patch set [2].
This client is needed to properly integrate coming RDMAtool [3] into iproute2 package which is based on netlink.
The following patch set can be logically divided into four parts:
* Cleanup of RDMA netlink interface to handle dumpit/doit callbacks.
* Implementation of static ib_device index to allow future renaming support for IB devices.
* NLDEV initial implementation.
* Exposing various device ports properties.
Doug,
This series passed extensive review and I would be happy to see this series series merged in this merge window, so I will be able to focus on more complex types for the "get interface" and on on "set ability", which is long waited feature for the whole RDMA stack [4].
Thanks
Chagelog:v1->v2:
* Groupped all various export* commits into this one patch set.
* Fixed reversed port vailidy check.
* Limited export of fields only for supported protocols.
* Followed sysfs naming for various exported properties.v0->v1:
* Added Steve's Reviewed-by tags for all patches except patch #8, because it was completely rewritten.
* Implemented static indexes for ib_device in patch #8 and dropped preview version which translated device name to corresponding ib_device.
* Fixed language in commit messages as was pointed by Steve.
* Rename TODO to be FIXME in patch #11.
Thanks
[1] "Revert "IB/core: Add flow control to the portmapper netlink calls""
https://patchwork.kernel.org/patch/9752865/
[2] [PATCH rdma-next V3 0/5] Refactor RDMA netlink infrastructure
https://www.spinics.net/lists/linux-rdma/msg51455.html
[3] [RFC iproute2 0/8] RDMA tool
https://www.spinics.net/lists/linux-rdma/msg49575.html
[4] https://www.spinics.net/lists/linux-rdma/msg51476.html
Available in the "topic/rdma-netlink-v2" topic branch of this git repo:git://git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma.git
Or for browsing:
https://git.kernel.org/cgit/linux/kernel/git/leon/linux-rdma.git/log/?h=topic/rdma-netlink-v2
Leon Romanovsky (27):
RDMA/netlink: Add flag to consolidate common handing RDMA/netlink: Simplify the put_msg and put_attr RDMA/netlink: Rename and remove redundant parameter from ibnl_unicast RDMA/netlink: Rename and remove redundant parameter from
ibnl_multicast
RDMA/netlink: Simplify and rename ibnl_chk_listeners RDMA/netlink: Rename netlink callback struct
RDMA/core: Add iterator over ib_devices
RDMA/core: Add and expose static device index RDMA/netlink: Add and implement doit netlink callback RDMA/netlink: Reduce indirection access to cb_table RDMA/netlink: Convert LS to doit callback
RDMA/netlink: Update copyright
RDMA/netlink: Add netlink device definitions to UAPI RDMA/netlink: Add nldev initialization flows
RDMA/netlink: Implement nldev device dumpit calback RDMA/netlink: Add nldev device doit implementation RDMA/netlink: Add nldev port dumpit implementation RDMA/netlink: Implement nldev port doit callback RDMA/netlink: Expose device and port capability masks
RDMA: Simplify get firmware interface
RDMA/netlink: Export FW version
RDMA/netlink: Export node_guid and sys_image_guid RDMA/netlink: Advertise IB subnet prefix
RDMA/netink: Export lids and sm_lids
RDMA/netlink: Export LID mask counter (LMC)
RDMA/netlink: Provide port state and physical link state RDMA/netlink: Export node_type
drivers/infiniband/core/Makefile | 4 +- drivers/infiniband/core/addr.c | 12 +- drivers/infiniband/core/cma.c | 2 +- drivers/infiniband/core/core_priv.h | 21 +- drivers/infiniband/core/device.c | 82 ++++++- drivers/infiniband/core/iwcm.c | 2 +- drivers/infiniband/core/iwpm_msg.c | 8 +- drivers/infiniband/core/iwpm_util.c | 4 +- drivers/infiniband/core/netlink.c | 97 ++++---- drivers/infiniband/core/nldev.c | 312 +++++++++++++++++++++++++ drivers/infiniband/core/sa_query.c | 18 +- drivers/infiniband/core/sysfs.c | 4 +- drivers/infiniband/hw/cxgb3/iwch_provider.c | 5 +- drivers/infiniband/hw/cxgb4/provider.c | 5 +- drivers/infiniband/hw/hfi1/verbs.c | 5 +- drivers/infiniband/hw/i40iw/i40iw_verbs.c | 7 +- drivers/infiniband/hw/mlx4/main.c | 5 +- drivers/infiniband/hw/mlx5/main.c | 8 +- drivers/infiniband/hw/mthca/mthca_provider.c | 5 +- drivers/infiniband/hw/nes/nes_verbs.c | 5 +- drivers/infiniband/hw/ocrdma/ocrdma_main.c | 5 +- drivers/infiniband/hw/qedr/main.c | 5 +- drivers/infiniband/hw/usnic/usnic_ib_main.c | 6 +- drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c | 5 +- drivers/infiniband/ulp/ipoib/ipoib_ethtool.c | 3 +- include/rdma/ib_verbs.h | 8 +- include/rdma/rdma_netlink.h | 26 ++- include/uapi/rdma/rdma_netlink.h | 84 ++++++- 28 files changed, 611 insertions(+), 142 deletions(-) create mode 100644 drivers/infiniband/core/nldev.c
A message that is not in the archive (sent off-list or not yet received): 20170703062830.30361-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH v2 1/27 RDMA/netlink: Add flag to consolidate common handing
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add ability to provide flags to control RDMA netlink callbacks and convert addr.c and sa_query.c to be first users of such infrastructure. It allows to move their CAP_NET_ADMIN checks into netlink core.
--- drivers/infiniband/core/addr.c | 3 +-- drivers/infiniband/core/device.c | 12 +++++++++--- drivers/infiniband/core/netlink.c | 4 ++++ drivers/infiniband/core/sa_query.c | 6 ++---- include/rdma/rdma_netlink.h | 6 ++++++ 5 files changed, 22 insertions(+), 9 deletions(-)
drivers/infiniband/core/addr.c +1 -2
@@ -134,8 +134,7 @@ int ib_nl_handle_ip_res_resp(struct sk_buff *skb,const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh;if ((nlh->nlmsg_flags &NLM_F_REQUEST ) || - !(NETLINK_CB (skb).sk) || - !netlink_capable (skb,CAP_NET_ADMIN )) + !(NETLINK_CB (skb).sk))return -EPERM ;if (ib_nl_is_good_ip_resp (nlh))
drivers/infiniband/core/device.c +9 -3
@@ -1010,11 +1010,17 @@ EXPORT_SYMBOL(ib_get_net_dev_by_params);static const struct ibnl_client_cbs ibnl_ls_cb_table[] = { [RDMA_NL_LS_OP_RESOLVE ] = { - .dump = ib_nl_handle_resolve_resp}, + .dump = ib_nl_handle_resolve_resp, + .flags =RDMA_NL_ADMIN_PERM , + }, [RDMA_NL_LS_OP_SET_TIMEOUT ] = { - .dump = ib_nl_handle_set_timeout}, + .dump = ib_nl_handle_set_timeout, + .flags =RDMA_NL_ADMIN_PERM , + }, [RDMA_NL_LS_OP_IP_RESOLVE ] = { - .dump = ib_nl_handle_ip_res_resp}, + .dump = ib_nl_handle_ip_res_resp, + .flags =RDMA_NL_ADMIN_PERM , + }, };static int __init ib_core_init (void )
drivers/infiniband/core/netlink.c +4 -0
@@ -171,6 +171,10 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,if (!is_nl_valid (index, op))return -EINVAL ; +if ((rdma_nl_types[index].cb_table[op].flags &RDMA_NL_ADMIN_PERM ) && + !netlink_capable (skb,CAP_NET_ADMIN )) +return -EPERM ; +/* * For response or local service set_timeout request, * there is no need to use netlink_dump_start.
drivers/infiniband/core/sa_query.c +2 -4
@@ -1034,8 +1034,7 @@ int ib_nl_handle_set_timeout(struct sk_buff *skb,int ret;if (!(nlh->nlmsg_flags &NLM_F_REQUEST ) || - !(NETLINK_CB (skb).sk) || - !netlink_capable (skb,CAP_NET_ADMIN )) + !(NETLINK_CB (skb).sk))return -EPERM ; ret = nla_parse(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
@@ -1110,8 +1109,7 @@ int ib_nl_handle_resolve_resp(struct sk_buff *skb,int ret;if ((nlh->nlmsg_flags &NLM_F_REQUEST ) || - !(NETLINK_CB (skb).sk) || - !netlink_capable (skb,CAP_NET_ADMIN )) + !(NETLINK_CB (skb).sk))return -EPERM ;spin_lock_irqsave (&ib_nl_request_lock, flags);
include/rdma/rdma_netlink.h +6 -0
@@ -7,6 +7,12 @@struct ibnl_client_cbs {int (*dump)(struct sk_buff *skb,struct netlink_callback *nlcb); +u8 flags; +}; + +enum rdma_nl_flags { +/* Require CAP_NET_ADMIN */ +RDMA_NL_ADMIN_PERM =1 <<0 , };/**
Signature · 6 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
PATCH v2 5/27 RDMA/netlink: Simplify and rename ibnl_chk_listeners
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Make ibnl_chk_listeners function to be one line by removing unneeded comparison.
Rename that function to be complaint to other functions in RDMA netlink.
--- drivers/infiniband/core/addr.c | 2 +- drivers/infiniband/core/netlink.c | 7 +++---- drivers/infiniband/core/sa_query.c | 2 +- include/rdma/rdma_netlink.h | 6 ++++++ 4 files changed, 11 insertions(+), 6 deletions(-)
drivers/infiniband/core/addr.c +1 -1
@@ -324,7 +324,7 @@ static void queue_req(struct addr_req *req)static int ib_nl_fetch_ha (struct dst_entry *dst,struct rdma_dev_addr *dev_addr,const void *daddr,u32 seq,u16 family) { -if (ibnl_chk_listeners (RDMA_NL_GROUP_LS )) +if (rdma_nl_chk_listeners (RDMA_NL_GROUP_LS ))return -EADDRNOTAVAIL ;/* We fill in what we can, the response will fill the rest */
drivers/infiniband/core/netlink.c +3 -4
@@ -47,12 +47,11 @@ static struct {const struct ibnl_client_cbs *cb_table; } rdma_nl_types[RDMA_NL_NUM_CLIENTS ]; -int ibnl_chk_listeners (unsigned int group) +int rdma_nl_chk_listeners (unsigned int group) { -if (netlink_has_listeners (nls, group) ==0 ) -return -1 ; -return 0 ; +return (netlink_has_listeners (nls, group)) ?0 :-1 ; } +EXPORT_SYMBOL (rdma_nl_chk_listeners);static bool is_nl_msg_valid (unsigned int type,unsigned int op) {
drivers/infiniband/core/sa_query.c +1 -1
@@ -1419,7 +1419,7 @@ static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask)if ((query->flags &IB_SA_ENABLE_LOCAL_SERVICE ) && (!(query->flags &IB_SA_QUERY_OPA ))) { -if (!ibnl_chk_listeners (RDMA_NL_GROUP_LS )) { +if (!rdma_nl_chk_listeners (RDMA_NL_GROUP_LS )) {if (!ib_nl_make_request (query, gfp_mask))return id; }
include/rdma/rdma_netlink.h +6 -0
@@ -70,4 +70,10 @@ int rdma_nl_unicast(struct sk_buff *skb, u32 pid);*/ int rdma_nl_multicast (struct sk_buff *skb,unsigned int group,gfp_t flags); +/** +* Check if there are any listeners to the netlink group +* @group: the netlink group ID +* Returns 0 on success or a negative for no listeners. +*/ +int rdma_nl_chk_listeners (unsigned int group);#endif /* _RDMA_NETLINK_H */
Signature · 6 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
PATCH v2 12/27 RDMA/netlink: Update copyright
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add Mellanox to the copyright header.
--- drivers/infiniband/core/netlink.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/core/netlink.c +1 -0
@@ -1,4 +1,5 @@/* +* Copyright (c) 2017 Mellanox Technologies Inc. All rights reserved. * Copyright (c) 2010 Voltaire Inc. All rights reserved. * * This software is available to you under a choice of one of two
Signature · 6 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
PATCH v2 13/27 RDMA/netlink: Add netlink device definitions to UAPI
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Introduce new defines to rdma_netlink.h, so the RDMA configuration tool will be able to communicate with RDMA subsystem by using the shared defines.
The addition of new client (NLDEV) revealed the fact that we exposed by mistake the RDMA_NL_I40IW define which is not backed by any RDMA netlink by now and it won't be exposed in the future too. So this patch reuses the value and deletes the old defines.
The NLDEV operates with objects. The struct ib_device has two straightforward
objects: device itself and ports of that device.
This brings us to propose the following commands to work on those objects:
* RDMA_NLDEV_CMD_{GET,SET,NEW,DEL} - works on ib_device itself
* RDMA_NLDEV_CMD_PORT_{GET,SET,NEW,DEL} - works on ports of specific ib_device
Those commands receive/return the device index (RDMA_NLDEV_ATTR_DEV_INDEX) and port index (RDMA_NLDEV_ATTR_PORT_INDEX). For device object accesses, the RDMA_NLDEV_ATTR_PORT_INDEX will return the maximum number of ports for specific ib_device and for port access the actual port index.
The port index starts from 1 to follow RDMA/core internal semantics and the sysfs exposed knobs.
--- drivers/infiniband/core/netlink.c | 2 +- include/uapi/rdma/rdma_netlink.h | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-)
drivers/infiniband/core/netlink.c +1 -1
@@ -61,7 +61,7 @@ static bool is_nl_msg_valid(unsigned int type, unsigned int op)RDMA_NL_IWPM_NUM_OPS ,0 ,RDMA_NL_LS_NUM_OPS , - 0 }; + RDMA_NLDEV_NUM_OPS };/* * This BUILD_BUG_ON is intended to catch addition of new
include/uapi/rdma/rdma_netlink.h +38 -1
@@ -8,7 +8,7 @@ enum {RDMA_NL_IWCM ,RDMA_NL_RSVD ,RDMA_NL_LS ,/* RDMA Local Services */ -RDMA_NL_I40IW , +RDMA_NL_NLDEV ,/* RDMA device interface */ RDMA_NL_NUM_CLIENTS };
@@ -222,4 +222,41 @@ struct rdma_nla_ls_gid { __u8 gid[16]; }; +enum rdma_nldev_command { +RDMA_NLDEV_CMD_UNSPEC , + +RDMA_NLDEV_CMD_GET ,/* can dump */ +RDMA_NLDEV_CMD_SET , +RDMA_NLDEV_CMD_NEW , +RDMA_NLDEV_CMD_DEL , + +RDMA_NLDEV_CMD_PORT_GET ,/* can dump */ +RDMA_NLDEV_CMD_PORT_SET , +RDMA_NLDEV_CMD_PORT_NEW , +RDMA_NLDEV_CMD_PORT_DEL , + +RDMA_NLDEV_NUM_OPS +}; + +enum rdma_nldev_attr { +/* don't change the order or add anything between, this is ABI! */ +RDMA_NLDEV_ATTR_UNSPEC , + +/* Identifier for ib_device */ +RDMA_NLDEV_ATTR_DEV_INDEX ,/* u32 */ + +RDMA_NLDEV_ATTR_DEV_NAME ,/* string */ +/* +* Device index together with port index are identifiers +* for port/link properties. +* +* For RDMA_NLDEV_CMD_GET comamnd, port index will return number +* of available ports in ib_device, while for port specific operations, +* it will be real port index as it appears in sysfs. Port index follows +* sysfs notation and starts from 1 for the first port. +*/ +RDMA_NLDEV_ATTR_PORT_INDEX ,/* u32 */ + +RDMA_NLDEV_ATTR_MAX +};#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 6 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
PATCH v2 14/27 RDMA/netlink: Add nldev initialization flows
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add nldev init and exit flows to the RDMA/core.
--- drivers/infiniband/core/Makefile | 4 +++- drivers/infiniband/core/device.c | 2 ++ drivers/infiniband/core/nldev.c | 45 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 drivers/infiniband/core/nldev.c
drivers/infiniband/core/Makefile +3 -1
@@ -10,7 +10,9 @@ obj-$(CONFIG_INFINIBAND_USER_ACCESS) += ib_uverbs.o ib_ucm.o \ ib_core-y := packer.o ud_header.o verbs.o cq.o rw.o sysfs.o \ device.o fmr_pool.o cache.o netlink.o \ roce_gid_mgmt.o mr_pool.o addr.o sa_query.o \ - multicast.o mad.o smi.o agent.o mad_rmpp.o + multicast.o mad.o smi.o agent.o mad_rmpp.o \ + nldev.o + ib_core-$(CONFIG_INFINIBAND_USER_MEM) += umem.o ib_core-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o umem_rbtree.o ib_core-$(CONFIG_CGROUP_RDMA) += cgroup.o
drivers/infiniband/core/device.c +2 -0
@@ -1128,6 +1128,7 @@ static int __init ib_core_init(void) goto err_mad; } +nldev_init ();rdma_nl_register (RDMA_NL_LS , ibnl_ls_cb_table);ib_cache_setup ();
@@ -1151,6 +1152,7 @@ static int __init ib_core_init(void) static void __exit ib_core_cleanup(void) {ib_cache_cleanup (); +nldev_exit ();rdma_nl_unregister (RDMA_NL_LS );ib_sa_cleanup ();ib_mad_cleanup ();
drivers/infiniband/core/nldev.c new file +45 -0
45 lines not on this page · raw message
Signature · 6 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
PATCH v2 15/27 RDMA/netlink: Implement nldev device dumpit calback
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
This patch adds the ability to return all available devices together with their properties.
--- drivers/infiniband/core/nldev.c | 64 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-)
drivers/infiniband/core/nldev.c +63 -1
@@ -30,13 +30,75 @@* POSSIBILITY OF SUCH DAMAGE. */ +#include <net/netlink.h> #include <rdma/rdma_netlink.h> #include "core_priv.h" +static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX ] = { + [RDMA_NLDEV_ATTR_DEV_INDEX ] = { .type =NLA_U32 }, + [RDMA_NLDEV_ATTR_DEV_NAME ] = { .type =NLA_NUL_STRING , + .len =IB_DEVICE_NAME_MAX -1 }, + [RDMA_NLDEV_ATTR_PORT_INDEX ] = { .type =NLA_U32 }, +}; + +static int fill_dev_info (struct sk_buff *msg,struct ib_device *device) +{ +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_DEV_INDEX , device->index)) +return -EMSGSIZE ; +if (nla_put_string (msg,RDMA_NLDEV_ATTR_DEV_NAME , device->name)) +return -EMSGSIZE ; +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_PORT_INDEX ,rdma_end_port (device))) +return -EMSGSIZE ; +return 0 ; +} + +static int _nldev_get_dumpit (struct ib_device *device, +struct sk_buff *skb, +struct netlink_callback *cb, +unsigned int idx) +{ +int start = cb->args[0 ]; +struct nlmsghdr *nlh; + +if (idx < start) +return 0 ; + + nlh =nlmsg_put (skb,NETLINK_CB (cb->skb).portid, cb->nlh->nlmsg_seq, +RDMA_NL_GET_TYPE (RDMA_NL_NLDEV ,RDMA_NLDEV_CMD_GET ), +0 ,NLM_F_MULTI ); + +if (fill_dev_info (skb, device)) { +nlmsg_cancel (skb, nlh); + goto out; + } + +nlmsg_end (skb, nlh); + + idx++; + +out: cb->args[0 ] = idx; +return skb->len; +} + +static int nldev_get_dumpit (struct sk_buff *skb,struct netlink_callback *cb) +{ +/* +* There is no need to take lock, because +* we are relying on ib_core's lists_rwsem +*/ +return ib_enum_all_devs (_nldev_get_dumpit, skb, cb); +} + +static const struct rdma_nl_cbs nldev_cb_table[] = { + [RDMA_NLDEV_CMD_GET ] = { + .dump = nldev_get_dumpit, + }, +}; +void __init nldev_init (void ) { -rdma_nl_register (RDMA_NL_NLDEV ,NULL ); +rdma_nl_register (RDMA_NL_NLDEV , nldev_cb_table); } void __exit nldev_exit(void)
Signature · 6 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
PATCH v2 19/27 RDMA/netlink: Expose device and port capability masks
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
The port capability mask is exposed to user space via sysfs interface, while device capabilities are available for verbs only.
This patch provides those capabilities through netlink interface.
--- drivers/infiniband/core/nldev.c | 19 +++++++++++++++++++ include/uapi/rdma/rdma_netlink.h | 5 +++++ 2 files changed, 24 insertions(+)
drivers/infiniband/core/nldev.c +19 -0
@@ -50,18 +50,37 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)return -EMSGSIZE ;if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_PORT_INDEX ,rdma_end_port (device)))return -EMSGSIZE ; + +BUILD_BUG_ON (sizeof (device->attrs.device_cap_flags) !=sizeof (u64)); +if (nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_CAP_FLAGS , + device->attrs.device_cap_flags,0 )) +return -EMSGSIZE ; +return 0 ; }static int fill_port_info (struct sk_buff *msg,struct ib_device *device,u32 port) { +struct ib_port_attr attr; +int ret; +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_DEV_INDEX , device->index))return -EMSGSIZE ;if (nla_put_string (msg,RDMA_NLDEV_ATTR_DEV_NAME , device->name))return -EMSGSIZE ;if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_PORT_INDEX , port))return -EMSGSIZE ; + + ret =ib_query_port (device, port, &attr); +if (ret) +return ret; + +BUILD_BUG_ON (sizeof (attr.port_cap_flags) >sizeof (u64)); +if (nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_CAP_FLAGS , + (u64 )attr.port_cap_flags,0 )) +return -EMSGSIZE ; +return 0 ; }
include/uapi/rdma/rdma_netlink.h +5 -0
@@ -257,6 +257,11 @@ enum rdma_nldev_attr {*/ RDMA_NLDEV_ATTR_PORT_INDEX ,/* u32 */ +/* +* Device and port capabilities +*/ +RDMA_NLDEV_ATTR_CAP_FLAGS ,/* u64 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 6 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
PATCH v2 23/27 RDMA/netlink: Advertise IB subnet prefix
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add IB subnet prefix to the port properties exported by RDMA netlink.
--- drivers/infiniband/core/nldev.c | 5 +++++ include/uapi/rdma/rdma_netlink.h | 5 +++++ 2 files changed, 10 insertions(+)
drivers/infiniband/core/nldev.c +5 -0
@@ -44,6 +44,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { .len = IB_FW_VERSION_NAME_MAX - 1}, [RDMA_NLDEV_ATTR_NODE_GUID] = { .type = NLA_U64 }, [RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = { .type = NLA_U64 }, + [RDMA_NLDEV_ATTR_SUBNET_PREFIX] = { .type = NLA_U64 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)
@@ -97,6 +98,10 @@ static int fill_port_info(struct sk_buff *msg,if (nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_CAP_FLAGS , (u64 )attr.port_cap_flags,0 ))return -EMSGSIZE ; +if (rdma_protocol_ib (device, port) && +nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_SUBNET_PREFIX , + attr.subnet_prefix,0 )) +return -EMSGSIZE ;return 0 ; }
include/uapi/rdma/rdma_netlink.h +5 -0
@@ -279,6 +279,11 @@ enum rdma_nldev_attr {*/ RDMA_NLDEV_ATTR_SYS_IMAGE_GUID ,/* u64 */ +/* +* Subnet prefix (in host byte order) +*/ +RDMA_NLDEV_ATTR_SUBNET_PREFIX ,/* u64 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 6 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
PATCH v2 27/27 RDMA/netlink: Export node_type
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Add ability to get node_type for RDAM netlink users.
--- drivers/infiniband/core/nldev.c | 3 +++ include/uapi/rdma/rdma_netlink.h | 2 ++ 2 files changed, 5 insertions(+)
drivers/infiniband/core/nldev.c +3 -0
@@ -50,6 +50,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_LMC] = { .type = NLA_U8 }, [RDMA_NLDEV_ATTR_PORT_STATE] = { .type = NLA_U8 }, [RDMA_NLDEV_ATTR_PORT_PHYS_STATE] = { .type = NLA_U8 }, + [RDMA_NLDEV_ATTR_DEV_NODE_TYPE] = { .type = NLA_U8 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)
@@ -79,6 +80,8 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)if (nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_SYS_IMAGE_GUID ,be64_to_cpu (device->attrs.sys_image_guid),0 ))return -EMSGSIZE ; +if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_DEV_NODE_TYPE , device->node_type)) +return -EMSGSIZE ;return 0 ; }
include/uapi/rdma/rdma_netlink.h +2 -0
@@ -300,6 +300,8 @@ enum rdma_nldev_attr {RDMA_NLDEV_ATTR_PORT_STATE ,/* u8 */ RDMA_NLDEV_ATTR_PORT_PHYS_STATE ,/* u8 */ +RDMA_NLDEV_ATTR_DEV_NODE_TYPE ,/* u8 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 6 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
PATCH v2 2/27 RDMA/netlink: Simplify the put_msg and put_attr
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Reuse standard macros to cancel the netlink message in case of error.
--- drivers/infiniband/core/netlink.c | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-)
drivers/infiniband/core/netlink.c +9 -22
@@ -126,36 +126,23 @@ EXPORT_SYMBOL(rdma_nl_unregister);void *ibnl_put_msg (struct sk_buff *skb,struct nlmsghdr **nlh,int seq,int len,int client,int op,int flags) { -unsigned char *prev_tail; - - prev_tail =skb_tail_pointer (skb); - *nlh =nlmsg_put (skb,0 , seq,RDMA_NL_GET_TYPE (client, op), - len, flags); -if (!*nlh) - goto out_nlmsg_trim; - (*nlh)->nlmsg_len =skb_tail_pointer (skb) - prev_tail; + *nlh =nlmsg_put (skb,0 , seq,RDMA_NL_GET_TYPE (client, op), len, flags); +if (!*nlh) { +nlmsg_cancel (skb, *nlh); +return NULL ; + }return nlmsg_data (*nlh); - -out_nlmsg_trim: -nlmsg_trim (skb, prev_tail); -return NULL ; }EXPORT_SYMBOL (ibnl_put_msg);int ibnl_put_attr (struct sk_buff *skb,struct nlmsghdr *nlh,int len,void *data,int type) { -unsigned char *prev_tail; - - prev_tail =skb_tail_pointer (skb); -if (nla_put (skb, type, len, data)) - goto nla_put_failure; - nlh->nlmsg_len +=skb_tail_pointer (skb) - prev_tail; +if (nla_put (skb, type, len, data)) { +nlmsg_cancel (skb, nlh); +return -EMSGSIZE ; + }return 0 ; - -nla_put_failure: -nlmsg_trim (skb, prev_tail - nlh->nlmsg_len); -return -EMSGSIZE ; }EXPORT_SYMBOL (ibnl_put_attr);
Signature · 1 line
2.13.2
PATCH v2 3/27 RDMA/netlink: Rename and remove redundant parameter from ibnl_unicast
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Netlink message header is not needed for unicast reply, hence remove it.
--- drivers/infiniband/core/iwpm_msg.c | 6 +++--- drivers/infiniband/core/iwpm_util.c | 4 ++-- drivers/infiniband/core/netlink.c | 5 ++--- include/rdma/rdma_netlink.h | 4 +--- 4 files changed, 8 insertions(+), 11 deletions(-)
drivers/infiniband/core/iwpm_msg.c +3 -3
@@ -172,7 +172,7 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) goto add_mapping_error; nlmsg_request->req_buffer = pm_msg; - ret =ibnl_unicast (skb, nlh, iwpm_user_pid); + ret =rdma_nl_unicast (skb, iwpm_user_pid);if (ret) { skb =NULL ;/* skb is freed in the netlink send-op handling */ iwpm_user_pid =IWPM_PID_UNDEFINED ;
@@ -248,7 +248,7 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) goto query_mapping_error; nlmsg_request->req_buffer = pm_msg; - ret =ibnl_unicast (skb, nlh, iwpm_user_pid); + ret =rdma_nl_unicast (skb, iwpm_user_pid);if (ret) { skb =NULL ;/* skb is freed in the netlink send-op handling */ err_str ="Unable to send a nlmsg" ;
@@ -308,7 +308,7 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client)if (ret) goto remove_mapping_error; - ret =ibnl_unicast (skb, nlh, iwpm_user_pid); + ret =rdma_nl_unicast (skb, iwpm_user_pid);if (ret) { skb =NULL ;/* skb is freed in the netlink send-op handling */ iwpm_user_pid =IWPM_PID_UNDEFINED ;
drivers/infiniband/core/iwpm_util.c +2 -2
@@ -597,7 +597,7 @@ static int send_mapinfo_num(u32 mapping_num, u8 nl_client, int iwpm_pid) &mapping_num, IWPM_NLA_MAPINFO_SEND_NUM);if (ret) goto mapinfo_num_error; - ret =ibnl_unicast (skb, nlh, iwpm_pid); + ret =rdma_nl_unicast (skb, iwpm_pid);if (ret) { skb =NULL ; err_str ="Unable to send a nlmsg" ;
@@ -626,7 +626,7 @@ static int send_nlmsg_done(struct sk_buff *skb, u8 nl_client, int iwpm_pid)return -ENOMEM ; } nlh->nlmsg_type =NLMSG_DONE ; - ret =ibnl_unicast (skb, (struct nlmsghdr *)skb->data, iwpm_pid); + ret =rdma_nl_unicast (skb, iwpm_pid);if (ret)pr_warn ("%s Unable to send a nlmsg\n" , __func__);return ret;
drivers/infiniband/core/netlink.c +2 -3
@@ -241,12 +241,11 @@ static void rdma_nl_rcv(struct sk_buff *skb)mutex_unlock (&rdma_nl_mutex); } -int ibnl_unicast (struct sk_buff *skb,struct nlmsghdr *nlh, -__u32 pid) +int rdma_nl_unicast (struct sk_buff *skb,u32 pid) {return nlmsg_unicast (nls, skb, pid); } -EXPORT_SYMBOL (ibnl_unicast); +EXPORT_SYMBOL (rdma_nl_unicast);int ibnl_multicast (struct sk_buff *skb,struct nlmsghdr *nlh,unsigned int group,gfp_t flags)
include/rdma/rdma_netlink.h +1 -3
@@ -56,12 +56,10 @@ int ibnl_put_attr(struct sk_buff *skb, struct nlmsghdr *nlh,/** * Send the supplied skb to a specific userspace PID. * @skb: The netlink skb -* @nlh: Header of the netlink message to send * @pid: Userspace netlink process ID * Returns 0 on success or a negative error code. */ -int ibnl_unicast (struct sk_buff *skb,struct nlmsghdr *nlh, -__u32 pid); +int rdma_nl_unicast (struct sk_buff *skb,u32 pid);/** * Send the supplied skb to a netlink group.
Signature · 1 line
2.13.2
PATCH v2 4/27 RDMA/netlink: Rename and remove redundant parameter from ibnl_multicast
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The pointer to netlink header was not used in the ibnl_multicast function, so let's remove it and simplify the function signature.
--- drivers/infiniband/core/addr.c | 2 +- drivers/infiniband/core/iwpm_msg.c | 2 +- drivers/infiniband/core/netlink.c | 5 ++--- drivers/infiniband/core/sa_query.c | 2 +- include/rdma/rdma_netlink.h | 4 +--- 5 files changed, 6 insertions(+), 9 deletions(-)
drivers/infiniband/core/addr.c +1 -1
@@ -185,7 +185,7 @@ static int ib_nl_ip_send_msg(struct rdma_dev_addr *dev_addr,/* Repair the nlmsg header length */ nlmsg_end (skb, nlh); -ibnl_multicast (skb, nlh,RDMA_NL_GROUP_LS ,GFP_KERNEL ); +rdma_nl_multicast (skb,RDMA_NL_GROUP_LS ,GFP_KERNEL );/* Make the request retry, so when we get the response from userspace * we will have something.
drivers/infiniband/core/iwpm_msg.c +1 -1
@@ -103,7 +103,7 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)pr_debug ("%s: Multicasting a nlmsg (dev = %s ifname = %s iwpm = %s)\n" , __func__, pm_msg->dev_name, pm_msg->if_name, iwpm_ulib_name); - ret =ibnl_multicast (skb, nlh,RDMA_NL_GROUP_IWPM ,GFP_KERNEL ); + ret =rdma_nl_multicast (skb,RDMA_NL_GROUP_IWPM ,GFP_KERNEL );if (ret) { skb =NULL ;/* skb is freed in the netlink send-op handling */ iwpm_user_pid =IWPM_PID_UNAVAILABLE ;
drivers/infiniband/core/netlink.c +2 -3
@@ -247,12 +247,11 @@ int rdma_nl_unicast(struct sk_buff *skb, u32 pid) }EXPORT_SYMBOL (rdma_nl_unicast); -int ibnl_multicast (struct sk_buff *skb,struct nlmsghdr *nlh, -unsigned int group,gfp_t flags) +int rdma_nl_multicast (struct sk_buff *skb,unsigned int group,gfp_t flags) {return nlmsg_multicast (nls, skb,0 , group, flags); } -EXPORT_SYMBOL (ibnl_multicast); +EXPORT_SYMBOL (rdma_nl_multicast);int __init rdma_nl_init (void ) {
drivers/infiniband/core/sa_query.c +1 -1
@@ -862,7 +862,7 @@ static int ib_nl_send_msg(struct ib_sa_query *query, gfp_t gfp_mask)/* Repair the nlmsg header length */ nlmsg_end (skb, nlh); - ret =ibnl_multicast (skb, nlh,RDMA_NL_GROUP_LS , gfp_mask); + ret =rdma_nl_multicast (skb,RDMA_NL_GROUP_LS , gfp_mask);if (!ret) ret = len;else
include/rdma/rdma_netlink.h +1 -3
@@ -64,12 +64,10 @@ int rdma_nl_unicast(struct sk_buff *skb, u32 pid);/** * Send the supplied skb to a netlink group. * @skb: The netlink skb -* @nlh: Header of the netlink message to send * @group: Netlink group ID * @flags: allocation flags * Returns 0 on success or a negative error code. */ -int ibnl_multicast (struct sk_buff *skb,struct nlmsghdr *nlh, -unsigned int group,gfp_t flags); +int rdma_nl_multicast (struct sk_buff *skb,unsigned int group,gfp_t flags);#endif /* _RDMA_NETLINK_H */
Signature · 1 line
2.13.2
PATCH v2 6/27 RDMA/netlink: Rename netlink callback struct
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The RDMA netlink client infrastructure was removed and made obsolete the old name (ibnl_client_cbs). This patch renames to the more appropriate name (rdma_nl_cbs).
--- drivers/infiniband/core/cma.c | 2 +- drivers/infiniband/core/device.c | 2 +- drivers/infiniband/core/iwcm.c | 2 +- drivers/infiniband/core/netlink.c | 4 ++-- include/rdma/rdma_netlink.h | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-)
drivers/infiniband/core/cma.c +1 -1
@@ -4476,7 +4476,7 @@ static int cma_get_id_stats(struct sk_buff *skb, struct netlink_callback *cb)return skb->len; } -static const struct ibnl_client_cbs cma_cb_table[] = { +static const struct rdma_nl_cbs cma_cb_table[] = { [RDMA_NL_RDMA_CM_ID_STATS ] = { .dump = cma_get_id_stats}, };
drivers/infiniband/core/device.c +1 -1
@@ -1008,7 +1008,7 @@ struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, }EXPORT_SYMBOL (ib_get_net_dev_by_params); -static const struct ibnl_client_cbs ibnl_ls_cb_table[] = { +static const struct rdma_nl_cbs ibnl_ls_cb_table[] = { [RDMA_NL_LS_OP_RESOLVE ] = { .dump = ib_nl_handle_resolve_resp, .flags =RDMA_NL_ADMIN_PERM ,
drivers/infiniband/core/iwcm.c +1 -1
@@ -80,7 +80,7 @@ const char *__attribute_const__ iwcm_reject_msg(int reason) }EXPORT_SYMBOL (iwcm_reject_msg); -static struct ibnl_client_cbs iwcm_nl_cb_table[] = { +static struct rdma_nl_cbs iwcm_nl_cb_table[] = { [RDMA_NL_IWPM_REG_PID ] = {.dump = iwpm_register_pid_cb}, [RDMA_NL_IWPM_ADD_MAPPING ] = {.dump = iwpm_add_mapping_cb}, [RDMA_NL_IWPM_QUERY_MAPPING ] = {.dump = iwpm_add_and_query_mapping_cb},
drivers/infiniband/core/netlink.c +2 -2
@@ -44,7 +44,7 @@static DEFINE_MUTEX (rdma_nl_mutex);static struct sock *nls;static struct { -const struct ibnl_client_cbs *cb_table; +const struct rdma_nl_cbs *cb_table; } rdma_nl_types[RDMA_NL_NUM_CLIENTS ];int rdma_nl_chk_listeners (unsigned int group)
@@ -84,7 +84,7 @@ static bool is_nl_valid(unsigned int type, unsigned int op) }void rdma_nl_register (unsigned int index, -const struct ibnl_client_cbs cb_table[]) +const struct rdma_nl_cbs cb_table[]) {mutex_lock (&rdma_nl_mutex);if (!is_nl_msg_valid (index,0 )) {
include/rdma/rdma_netlink.h +2 -2
@@ -5,7 +5,7 @@#include <linux/netlink.h> #include <uapi/rdma/rdma_netlink.h> -struct ibnl_client_cbs { +struct rdma_nl_cbs {int (*dump)(struct sk_buff *skb,struct netlink_callback *nlcb);u8 flags; };
@@ -21,7 +21,7 @@ enum rdma_nl_flags {* @cb_table: A table for op->callback */ void rdma_nl_register (unsigned int index, -const struct ibnl_client_cbs cb_table[]); +const struct rdma_nl_cbs cb_table[]);/** * Remove a client from IB netlink.
Signature · 1 line
2.13.2
PATCH v2 7/27 RDMA/core: Add iterator over ib_devices
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The coming nldev needs to iterate over all IB devices in the system and in order to not expose the ib_devices list outside the devices.c, it is necessary to provide function iterator.
Current version is written explicitly for nldev callback to avoid over-engineering at this stage, but it can be easily extended for other types.
--- drivers/infiniband/core/core_priv.h | 8 ++++++++ drivers/infiniband/core/device.c | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+)
drivers/infiniband/core/core_priv.h +8 -0
@@ -92,6 +92,14 @@ void ib_enum_all_roce_netdevs(roce_netdev_filter filter,roce_netdev_callback cb, void *cookie); +typedef int (*nldev_callback )(struct ib_device *device, +struct sk_buff *skb, +struct netlink_callback *cb, +unsigned int idx); + +int ib_enum_all_devs (nldev_callback nldev_cb,struct sk_buff *skb, +struct netlink_callback *cb); +enum ib_cache_gid_default_mode {IB_CACHE_GID_DEFAULT_MODE_SET ,IB_CACHE_GID_DEFAULT_MODE_DELETE
drivers/infiniband/core/device.c +25 -0
@@ -815,6 +815,31 @@ void ib_enum_all_roce_netdevs(roce_netdev_filter filter, }/** +* ib_enum_all_devs - enumerate all ib_devices +* @cb: Callback to call for each found ib_device +* +* Enumerates all ib_devices and calls callback() on each device. +*/ +int ib_enum_all_devs (nldev_callback nldev_cb,struct sk_buff *skb, +struct netlink_callback *cb) +{ +struct ib_device *dev; +unsigned int idx =0 ; +int ret =0 ; + +down_read (&lists_rwsem); +list_for_each_entry (dev, &device_list, core_list) { + ret =nldev_cb (dev, skb, cb, idx); +if (ret) +break ; + idx++; + } + +up_read (&lists_rwsem); +return ret; +} + +/** * ib_query_pkey - Get P_Key table entry * @device:Device to query * @port_num:Port number to query
Signature · 1 line
2.13.2
PATCH v2 8/27 RDMA/core: Add and expose static device index
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
This patch adds static device index in similar fashion to already available in netdev world (struct net->ifindex).
In downstream patches, the RDMA nelink will use this idx-to-ib_device conversion, so as part of this commit, we are exposing the translation function to be visible for IB/core users.
--- drivers/infiniband/core/core_priv.h | 4 ++++ drivers/infiniband/core/device.c | 37 ++++++++++++++++++++++++++++++++++++- include/rdma/ib_verbs.h | 2 ++ 3 files changed, 42 insertions(+), 1 deletion(-)
drivers/infiniband/core/core_priv.h +4 -0
@@ -194,4 +194,8 @@ int ib_nl_handle_set_timeout(struct sk_buff *skb,int ib_nl_handle_ip_res_resp (struct sk_buff *skb,struct netlink_callback *cb); +struct ib_device *__ib_device_get_by_index (u32 ifindex); +/* RDMA device netlink */ +void nldev_init (void ); +void nldev_exit (void );#endif /* _CORE_PRIV_H */
drivers/infiniband/core/device.c +36 -1
@@ -124,6 +124,17 @@ static int ib_device_check_mandatory(struct ib_device *device)return 0 ; } +struct ib_device *__ib_device_get_by_index (u32 index) +{ +struct ib_device *device; + +list_for_each_entry (device, &device_list, core_list) +if (device->index == index) +return device; + +return NULL ; +} +static struct ib_device *__ib_device_get_by_name (const char *name) {struct ib_device *device;
@@ -135,7 +146,6 @@ static struct ib_device *__ib_device_get_by_name(const char *name)return NULL ; } -static int alloc_name (char *name) {unsigned long *inuse;
@@ -326,6 +336,30 @@ void ib_get_device_fw_str(struct ib_device *dev, char *str, size_t str_len)EXPORT_SYMBOL (ib_get_device_fw_str);/** +* __dev_new_index - allocate an device index +* +* Returns a suitable unique value for a new device interface +* number. It assumes that there are less than 2^32-1 ib devices +* will be present in the system. +*/ +static u32 __dev_new_index (void ) +{ +/* +* The device index to allow stable naming. +* Similar to struct net -> ifindex. +*/ +static u32 index; + +for (;;) { +if (!(++index)) + index =1 ; + +if (!__ib_device_get_by_index (index)) +return index; + } +} + +/** * ib_register_device - Register an IB device with IB core * @device:Device to register *
@@ -417,6 +451,7 @@ int ib_register_device(struct ib_device *device,if (client->add && !add_client_context (device, client)) client->add (device); + device->index =__dev_new_index ();down_write (&lists_rwsem);list_add_tail (&device->core_list, &device_list);up_write (&lists_rwsem);
include/rdma/ib_verbs.h +2 -0
@@ -2237,6 +2237,8 @@ struct ib_device {struct rdmacg_device cg_device;#endif +u32 index; +/** * The following mandatory functions are used only at device * registration. Keep functions such as these at the end of this
Signature · 1 line
2.13.2
PATCH v2 9/27 RDMA/netlink: Add and implement doit netlink callback
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The .doit callback is used by netlink core to differentiate between get and set operations. Common convention is to use that call for command operations like (SET, ADD, e.t.c.) and/or access without NLF_M_DUMP flag.
This commit adds proper declaration and implementation to RDMA netlink.
--- drivers/infiniband/core/netlink.c | 19 ++++++++++++++----- include/rdma/rdma_netlink.h | 2 ++ 2 files changed, 16 insertions(+), 5 deletions(-)
drivers/infiniband/core/netlink.c +14 -5
@@ -76,9 +76,13 @@ static bool is_nl_msg_valid(unsigned int type, unsigned int op)static bool is_nl_valid (unsigned int type,unsigned int op) { -if (!is_nl_msg_valid (type, op) || - !rdma_nl_types[type].cb_table || - !rdma_nl_types[type].cb_table[op].dump) +const struct rdma_nl_cbs *cb_table; + +if (!is_nl_msg_valid (type, op)) +return false; + + cb_table = rdma_nl_types[type].cb_table; +if (!cb_table || (!cb_table[op].dump && !cb_table[op].doit))return false;return true; }
@@ -153,6 +157,7 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,unsigned int op =RDMA_NL_GET_OP (type);struct netlink_callback cb = {};struct netlink_dump_control c = {}; +int ret;if (!is_nl_valid (index, op))return -EINVAL ;
@@ -171,10 +176,14 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, cb.nlh = nlh; cb.dump = rdma_nl_types[index].cb_table[op].dump;return cb.dump (skb, &cb); + }else { + c.dump = rdma_nl_types[index].cb_table[op].dump; +return netlink_dump_start (nls, skb, nlh, &c); } +if (rdma_nl_types[index].cb_table[op].doit) + ret = rdma_nl_types[index].cb_table[op].doit (skb, nlh, extack); +return ret; - c.dump = rdma_nl_types[index].cb_table[op].dump; -return netlink_dump_start (nls, skb, nlh, &c); }/*
include/rdma/rdma_netlink.h +2 -0
@@ -6,6 +6,8 @@#include <uapi/rdma/rdma_netlink.h> struct rdma_nl_cbs { +int (*doit)(struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack);int (*dump)(struct sk_buff *skb,struct netlink_callback *nlcb);u8 flags; };
Signature · 1 line
2.13.2
PATCH v2 10/27 RDMA/netlink: Reduce indirection access to cb_table
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Introduce intermediate variable to store access to fields of cb_table.
--- drivers/infiniband/core/netlink.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/infiniband/core/netlink.c +8 -5
@@ -157,12 +157,15 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,unsigned int op =RDMA_NL_GET_OP (type);struct netlink_callback cb = {};struct netlink_dump_control c = {}; +const struct rdma_nl_cbs *cb_table;int ret;if (!is_nl_valid (index, op))return -EINVAL ; -if ((rdma_nl_types[index].cb_table[op].flags &RDMA_NL_ADMIN_PERM ) && + cb_table = rdma_nl_types[type].cb_table; + +if ((cb_table[op].flags &RDMA_NL_ADMIN_PERM ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;
@@ -174,14 +177,14 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, (index == RDMA_NL_LS && op == RDMA_NL_LS_OP_SET_TIMEOUT)) { cb.skb = skb; cb.nlh = nlh; - cb.dump = rdma_nl_types[index].cb_table[op].dump; + cb.dump = cb_table[op].dump; return cb.dump(skb, &cb); } else { - c.dump = rdma_nl_types[index].cb_table[op].dump; + c.dump = cb_table[op].dump;return netlink_dump_start (nls, skb, nlh, &c); } -if (rdma_nl_types[index].cb_table[op].doit) - ret = rdma_nl_types[index].cb_table[op].doit (skb, nlh, extack); +if (cb_table[op].doit) + ret = cb_table[op].doit (skb, nlh, extack);return ret; }
Signature · 1 line
2.13.2
PATCH v2 11/27 RDMA/netlink: Convert LS to doit callback
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
RDMA_NL_LS protocol is actually does not dump anything, but sets data and it should be handled by doit callback.
This patch actually converts RDMA_NL_LS to doit callback, while preserving IWCM and RDMA_CM flows through netlink_dump_start().
--- drivers/infiniband/core/addr.c | 5 ++--- drivers/infiniband/core/core_priv.h | 9 ++++++--- drivers/infiniband/core/device.c | 6 +++--- drivers/infiniband/core/netlink.c | 28 ++++++++++------------------ drivers/infiniband/core/sa_query.c | 8 ++++---- 5 files changed, 25 insertions(+), 31 deletions(-)
drivers/infiniband/core/addr.c +2 -3
@@ -129,10 +129,9 @@ static void ib_nl_process_good_ip_rsep(const struct nlmsghdr *nlh) }int ib_nl_handle_ip_res_resp (struct sk_buff *skb, -struct netlink_callback *cb) +struct nlmsghdr *nlh, +struct netlink_ext_ack *extack) { -const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh; -if ((nlh->nlmsg_flags &NLM_F_REQUEST ) || !(NETLINK_CB (skb).sk))return -EPERM ;
drivers/infiniband/core/core_priv.h +6 -3
@@ -188,11 +188,14 @@ void rdma_nl_exit(void);int ibnl_chk_listeners (unsigned int group);int ib_nl_handle_resolve_resp (struct sk_buff *skb, -struct netlink_callback *cb); +struct nlmsghdr *nlh, +struct netlink_ext_ack *extack);int ib_nl_handle_set_timeout (struct sk_buff *skb, -struct netlink_callback *cb); +struct nlmsghdr *nlh, +struct netlink_ext_ack *extack);int ib_nl_handle_ip_res_resp (struct sk_buff *skb, -struct netlink_callback *cb); +struct nlmsghdr *nlh, +struct netlink_ext_ack *extack);struct ib_device *__ib_device_get_by_index (u32 ifindex);/* RDMA device netlink */
drivers/infiniband/core/device.c +3 -3
@@ -1070,15 +1070,15 @@ EXPORT_SYMBOL(ib_get_net_dev_by_params);static const struct rdma_nl_cbs ibnl_ls_cb_table[] = { [RDMA_NL_LS_OP_RESOLVE ] = { - .dump = ib_nl_handle_resolve_resp, + .doit = ib_nl_handle_resolve_resp, .flags =RDMA_NL_ADMIN_PERM , }, [RDMA_NL_LS_OP_SET_TIMEOUT ] = { - .dump = ib_nl_handle_set_timeout, + .doit = ib_nl_handle_set_timeout, .flags =RDMA_NL_ADMIN_PERM , }, [RDMA_NL_LS_OP_IP_RESOLVE ] = { - .dump = ib_nl_handle_ip_res_resp, + .doit = ib_nl_handle_ip_res_resp, .flags =RDMA_NL_ADMIN_PERM , }, };
drivers/infiniband/core/netlink.c +10 -18
@@ -155,38 +155,30 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,int type = nlh->nlmsg_type;unsigned int index =RDMA_NL_GET_CLIENT (type);unsigned int op =RDMA_NL_GET_OP (type); -struct netlink_callback cb = {}; -struct netlink_dump_control c = {};const struct rdma_nl_cbs *cb_table; -int ret;if (!is_nl_valid (index, op))return -EINVAL ; - cb_table = rdma_nl_types[type].cb_table; + cb_table = rdma_nl_types[index].cb_table;if ((cb_table[op].flags &RDMA_NL_ADMIN_PERM ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; -/* -* For response or local service set_timeout request, -* there is no need to use netlink_dump_start. -*/ -if (!(nlh->nlmsg_flags &NLM_F_REQUEST ) || - (index ==RDMA_NL_LS && op ==RDMA_NL_LS_OP_SET_TIMEOUT )) { - cb.skb = skb; - cb.nlh = nlh; - cb.dump = cb_table[op].dump; -return cb.dump (skb, &cb); - }else { - c.dump = cb_table[op].dump; +/* FIXME: Convert IWCM to properly handle doit callbacks */ +if ((nlh->nlmsg_flags &NLM_F_DUMP ) || index ==RDMA_NL_RDMA_CM || + index ==RDMA_NL_IWCM ) { +struct netlink_dump_control c = { + .dump = cb_table[op].dump, + };return netlink_dump_start (nls, skb, nlh, &c); } +if (cb_table[op].doit) - ret = cb_table[op].doit (skb, nlh, extack); -return ret; +return cb_table[op].doit (skb, nlh, extack); +return 0 ; }/*
drivers/infiniband/core/sa_query.c +4 -4
@@ -1022,9 +1022,9 @@ static void ib_nl_request_timeout(struct work_struct *work) }int ib_nl_handle_set_timeout (struct sk_buff *skb, -struct netlink_callback *cb) +struct nlmsghdr *nlh, +struct netlink_ext_ack *extack) { -const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh;int timeout, delta, abs_delta;const struct nlattr *attr;unsigned long flags;
@@ -1098,9 +1098,9 @@ static inline int ib_nl_is_good_resolve_resp(const struct nlmsghdr *nlh) }int ib_nl_handle_resolve_resp (struct sk_buff *skb, -struct netlink_callback *cb) +struct nlmsghdr *nlh, +struct netlink_ext_ack *extack) { -const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh;unsigned long flags;struct ib_sa_query *query;struct ib_mad_send_buf *send_buf;
Signature · 1 line
2.13.2
PATCH v2 16/27 RDMA/netlink: Add nldev device doit implementation
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Provide ability to query specific device.
--- drivers/infiniband/core/nldev.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
drivers/infiniband/core/nldev.c +40 -0
@@ -53,6 +53,45 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)return 0 ; } +static int nldev_get_doit (struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack) +{ +struct nlattr *tb[RDMA_NLDEV_ATTR_MAX ]; +struct ib_device *device; +struct sk_buff *msg; +u32 index; +int err; + + err =nlmsg_parse (nlh,0 , tb,RDMA_NLDEV_ATTR_MAX -1 , + nldev_policy, extack); +if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX ]) +return -EINVAL ; + + index =nla_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); + + device =__ib_device_get_by_index (index); +if (!device) +return -EINVAL ; + + msg =nlmsg_new (NLMSG_DEFAULT_SIZE ,GFP_KERNEL ); +if (!msg) +return -ENOMEM ; + + nlh =nlmsg_put (msg,NETLINK_CB (skb).portid, nlh->nlmsg_seq, +RDMA_NL_GET_TYPE (RDMA_NL_NLDEV ,RDMA_NLDEV_CMD_GET ), +0 ,0 ); + + err =fill_dev_info (msg, device); +if (err) { +nlmsg_free (msg); +return err; + } + +nlmsg_end (msg, nlh); + +return rdma_nl_unicast (msg,NETLINK_CB (skb).portid); +} + static int _nldev_get_dumpit(struct ib_device *device, struct sk_buff *skb, struct netlink_callback *cb,
@@ -92,6 +131,7 @@ static int nldev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)static const struct rdma_nl_cbs nldev_cb_table[] = { [RDMA_NLDEV_CMD_GET ] = { + .doit = nldev_get_doit, .dump = nldev_get_dumpit, }, };
Signature · 1 line
2.13.2
PATCH v2 17/27 RDMA/netlink: Add nldev port dumpit implementation
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
This patch implements the query interface to get all ports data for the specific device.
--- drivers/infiniband/core/nldev.c | 61 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+)
drivers/infiniband/core/nldev.c +61 -0
@@ -53,6 +53,18 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)return 0 ; } +static int fill_port_info (struct sk_buff *msg, +struct ib_device *device,u32 port) +{ +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_DEV_INDEX , device->index)) +return -EMSGSIZE ; +if (nla_put_string (msg,RDMA_NLDEV_ATTR_DEV_NAME , device->name)) +return -EMSGSIZE ; +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_PORT_INDEX , port)) +return -EMSGSIZE ; +return 0 ; +} +static int nldev_get_doit (struct sk_buff *skb,struct nlmsghdr *nlh,struct netlink_ext_ack *extack) {
@@ -129,11 +141,60 @@ static int nldev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)return ib_enum_all_devs (_nldev_get_dumpit, skb, cb); } +static int nldev_port_get_dumpit (struct sk_buff *skb, +struct netlink_callback *cb) +{ +struct nlattr *tb[RDMA_NLDEV_ATTR_MAX ]; +struct ib_device *device; +int start = cb->args[0 ]; +struct nlmsghdr *nlh; +u32 idx =0 ; +u32 ifindex; +int err; +u32 p; + + err =nlmsg_parse (cb->nlh,0 , tb,RDMA_NLDEV_ATTR_MAX -1 , + nldev_policy,NULL ); +if (err || !tb[RDMA_NLDEV_ATTR_DEV_INDEX ]) +return -EINVAL ; + + ifindex =nla_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); + device =__ib_device_get_by_index (ifindex); +if (!device) +return -EINVAL ; + +for (p =rdma_start_port (device); p <=rdma_end_port (device); ++p) { +if (idx < start) { + idx++; +continue ; + } + + nlh =nlmsg_put (skb,NETLINK_CB (cb->skb).portid, + cb->nlh->nlmsg_seq, +RDMA_NL_GET_TYPE (RDMA_NL_NLDEV , +RDMA_NLDEV_CMD_PORT_GET ), +0 ,NLM_F_MULTI ); + +if (fill_port_info (skb, device, p)) { +nlmsg_cancel (skb, nlh); + goto out; + } + idx++; +nlmsg_end (skb, nlh); + } + +out: cb->args[0 ] = idx; +return skb->len; +} +static const struct rdma_nl_cbs nldev_cb_table[] = { [RDMA_NLDEV_CMD_GET ] = { .doit = nldev_get_doit, .dump = nldev_get_dumpit, }, + [RDMA_NLDEV_CMD_PORT_GET ] = { + .dump = nldev_port_get_dumpit, + }, };void __init nldev_init (void )
Signature · 1 line
2.13.2
PATCH v2 18/27 RDMA/netlink: Implement nldev port doit callback
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Provide ability to get specific to device and port information.
--- drivers/infiniband/core/nldev.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)
drivers/infiniband/core/nldev.c +44 -0
@@ -141,6 +141,49 @@ static int nldev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)return ib_enum_all_devs (_nldev_get_dumpit, skb, cb); } +static int nldev_port_get_doit (struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack) +{ +struct nlattr *tb[RDMA_NLDEV_ATTR_MAX ]; +struct ib_device *device; +struct sk_buff *msg; +u32 index; +u32 port; +int err; + + err =nlmsg_parse (nlh,0 , tb,RDMA_NLDEV_ATTR_MAX -1 , + nldev_policy, extack); +if (err || !tb[RDMA_NLDEV_ATTR_PORT_INDEX ]) +return -EINVAL ; + + index =nla_get_u32 (tb[RDMA_NLDEV_ATTR_DEV_INDEX ]); + device =__ib_device_get_by_index (index); +if (!device) +return -EINVAL ; + + port =nla_get_u32 (tb[RDMA_NLDEV_ATTR_PORT_INDEX ]); +if (!rdma_is_port_valid (device, port)) +return -EINVAL ; + + msg =nlmsg_new (NLMSG_DEFAULT_SIZE ,GFP_KERNEL ); +if (!msg) +return -ENOMEM ; + + nlh =nlmsg_put (msg,NETLINK_CB (skb).portid, nlh->nlmsg_seq, +RDMA_NL_GET_TYPE (RDMA_NL_NLDEV ,RDMA_NLDEV_CMD_GET ), +0 ,0 ); + + err =fill_port_info (msg, device, port); +if (err) { +nlmsg_free (msg); +return err; + } + +nlmsg_end (msg, nlh); + +return rdma_nl_unicast (msg,NETLINK_CB (skb).portid); +} +static int nldev_port_get_dumpit (struct sk_buff *skb,struct netlink_callback *cb) {
@@ -193,6 +236,7 @@ static const struct rdma_nl_cbs nldev_cb_table[] = { .dump = nldev_get_dumpit, }, [RDMA_NLDEV_CMD_PORT_GET] = { + .doit = nldev_port_get_doit, .dump = nldev_port_get_dumpit, }, };
Signature · 1 line
2.13.2
PATCH v2 20/27 RDMA: Simplify get firmware interface
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
There is a need to forward FW version to user space application through RDMA netlink. In order to make it safe, there is need to declare nla_policy and limit the size of FW string.
The new define IB_FW_VERSION_NAME_MAX will limit the size of FW version string. That define was chosen to be equal to ETHTOOL_FWVERS_LEN, because many drivers anyway are limited by that value indirectly.
The introduction of this define allows us to remove the string size from get_fw_str function signature.
--- drivers/infiniband/core/device.c | 4 ++-- drivers/infiniband/core/sysfs.c | 4 ++-- drivers/infiniband/hw/cxgb3/iwch_provider.c | 5 ++--- drivers/infiniband/hw/cxgb4/provider.c | 5 ++--- drivers/infiniband/hw/hfi1/verbs.c | 5 ++--- drivers/infiniband/hw/i40iw/i40iw_verbs.c | 7 +++---- drivers/infiniband/hw/mlx4/main.c | 5 ++--- drivers/infiniband/hw/mlx5/main.c | 8 ++++---- drivers/infiniband/hw/mthca/mthca_provider.c | 5 ++--- drivers/infiniband/hw/nes/nes_verbs.c | 5 ++--- drivers/infiniband/hw/ocrdma/ocrdma_main.c | 5 ++--- drivers/infiniband/hw/qedr/main.c | 5 ++--- drivers/infiniband/hw/usnic/usnic_ib_main.c | 6 ++---- drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c | 5 ++--- drivers/infiniband/ulp/ipoib/ipoib_ethtool.c | 3 +-- include/rdma/ib_verbs.h | 6 ++++-- 16 files changed, 36 insertions(+), 47 deletions(-)
drivers/infiniband/core/device.c +2 -2
@@ -326,10 +326,10 @@ static int read_port_immutable(struct ib_device *device)return 0 ; } -void ib_get_device_fw_str (struct ib_device *dev,char *str,size_t str_len) +void ib_get_device_fw_str (struct ib_device *dev,char *str) {if (dev->get_dev_fw_str) - dev->get_dev_fw_str (dev, str, str_len); + dev->get_dev_fw_str (dev, str);else str[0 ] ='\0' ; }
drivers/infiniband/core/sysfs.c +2 -2
@@ -1210,8 +1210,8 @@ static ssize_t show_fw_ver(struct device *device, struct device_attribute *attr, { struct ib_device *dev = container_of(device, struct ib_device, dev); -ib_get_device_fw_str (dev, buf,PAGE_SIZE ); -strlcat (buf,"\n" ,PAGE_SIZE ); +ib_get_device_fw_str (dev, buf); +strlcat (buf,"\n" ,IB_FW_VERSION_NAME_MAX );return strlen (buf); }
drivers/infiniband/hw/cxgb3/iwch_provider.c +2 -3
@@ -1337,8 +1337,7 @@ static int iwch_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_dev_fw_ver_str (struct ib_device *ibdev,char *str, -size_t str_len) +static void get_dev_fw_ver_str (struct ib_device *ibdev,char *str) {struct iwch_dev *iwch_dev =to_iwch_dev (ibdev);struct ethtool_drvinfo info;
@@ -1346,7 +1345,7 @@ static void get_dev_fw_ver_str(struct ib_device *ibdev, char *str,pr_debug ("%s dev 0x%p\n" , __func__, iwch_dev); lldev->ethtool_ops->get_drvinfo (lldev, &info); -snprintf (str, str_len,"%s" , info.fw_version); +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%s" , info.fw_version); }int iwch_register_device (struct iwch_dev *dev)
drivers/infiniband/hw/cxgb4/provider.c +2 -3
@@ -517,14 +517,13 @@ static int c4iw_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_dev_fw_str (struct ib_device *dev,char *str, -size_t str_len) +static void get_dev_fw_str (struct ib_device *dev,char *str) { struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, ibdev);pr_debug ("%s dev 0x%p\n" , __func__, dev); - snprintf(str, str_len, "%u.%u.%u.%u", + snprintf(str, IB_FW_VERSION_NAME_MAX, "%u.%u.%u.%u", FW_HDR_FW_VER_MAJOR_G(c4iw_dev->rdev.lldi.fw_vers), FW_HDR_FW_VER_MINOR_G(c4iw_dev->rdev.lldi.fw_vers), FW_HDR_FW_VER_MICRO_G(c4iw_dev->rdev.lldi.fw_vers),
drivers/infiniband/hw/hfi1/verbs.c +2 -3
@@ -1564,14 +1564,13 @@ static void init_ibport(struct hfi1_pportdata *ppd)RCU_INIT_POINTER (ibp->rvp.qp[1 ],NULL ); } -static void hfi1_get_dev_fw_str (struct ib_device *ibdev,char *str, -size_t str_len) +static void hfi1_get_dev_fw_str (struct ib_device *ibdev,char *str) {struct rvt_dev_info *rdi =ib_to_rvt (ibdev);struct hfi1_ibdev *dev =dev_from_rdi (rdi);u32 ver =dd_from_dev (dev)->dc8051_ver; -snprintf (str, str_len,"%u.%u.%u" ,dc8051_ver_maj (ver), +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%u.%u.%u" ,dc8051_ver_maj (ver),dc8051_ver_min (ver),dc8051_ver_patch (ver)); }
drivers/infiniband/hw/i40iw/i40iw_verbs.c +3 -4
@@ -2575,13 +2575,12 @@ static const char * const i40iw_hw_stat_names[] = { "iwRdmaInv" }; -static void i40iw_get_dev_fw_str (struct ib_device *dev,char *str, -size_t str_len) +static void i40iw_get_dev_fw_str (struct ib_device *dev,char *str) {u32 firmware_version =I40IW_FW_VERSION ; -snprintf (str, str_len,"%u.%u" , firmware_version, - (firmware_version &0x000000ff )); +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%u.%u" , firmware_version, + (firmware_version &0x000000ff )); }/**
drivers/infiniband/hw/mlx4/main.c +2 -3
@@ -2567,12 +2567,11 @@ static int mlx4_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_fw_ver_str (struct ib_device *device,char *str, -size_t str_len) +static void get_fw_ver_str (struct ib_device *device,char *str) {struct mlx4_ib_dev *dev = container_of(device, struct mlx4_ib_dev, ib_dev); -snprintf (str, str_len,"%d.%d.%d" , +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d.%d.%d" , (int ) (dev->dev->caps.fw_ver >>32 ), (int ) (dev->dev->caps.fw_ver >>16 ) &0xffff , (int ) dev->dev->caps.fw_ver &0xffff );
drivers/infiniband/hw/mlx5/main.c +4 -4
@@ -3181,13 +3181,13 @@ static int mlx5_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_dev_fw_str (struct ib_device *ibdev,char *str, -size_t str_len) +static void get_dev_fw_str (struct ib_device *ibdev,char *str) {struct mlx5_ib_dev *dev = container_of(ibdev, struct mlx5_ib_dev, ib_dev); -snprintf (str, str_len,"%d.%d.%04d" ,fw_rev_maj (dev->mdev), -fw_rev_min (dev->mdev),fw_rev_sub (dev->mdev)); +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d.%d.%04d" , +fw_rev_maj (dev->mdev),fw_rev_min (dev->mdev), +fw_rev_sub (dev->mdev)); }static int mlx5_eth_lag_init (struct mlx5_ib_dev *dev)
drivers/infiniband/hw/mthca/mthca_provider.c +2 -3
@@ -1178,12 +1178,11 @@ static int mthca_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_dev_fw_str (struct ib_device *device,char *str, -size_t str_len) +static void get_dev_fw_str (struct ib_device *device,char *str) {struct mthca_dev *dev = container_of(device, struct mthca_dev, ib_dev); -snprintf (str, str_len,"%d.%d.%d" , +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d.%d.%d" , (int ) (dev->fw_ver >>32 ), (int ) (dev->fw_ver >>16 ) &0xffff , (int ) dev->fw_ver &0xffff );
drivers/infiniband/hw/nes/nes_verbs.c +2 -3
@@ -3672,15 +3672,14 @@ static int nes_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_dev_fw_str (struct ib_device *dev,char *str, -size_t str_len) +static void get_dev_fw_str (struct ib_device *dev,char *str) {struct nes_ib_device *nesibdev = container_of(dev, struct nes_ib_device, ibdev);struct nes_vnic *nesvnic = nesibdev->nesvnic;nes_debug (NES_DBG_INIT ,"\n" ); -snprintf (str, str_len,"%u.%u" , +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%u.%u" , (nesvnic->nesdev->nesadapter->firmware_version >>16 ), (nesvnic->nesdev->nesadapter->firmware_version &0x000000ff )); }
drivers/infiniband/hw/ocrdma/ocrdma_main.c +2 -3
@@ -108,12 +108,11 @@ static int ocrdma_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void get_dev_fw_str (struct ib_device *device,char *str, -size_t str_len) +static void get_dev_fw_str (struct ib_device *device,char *str) {struct ocrdma_dev *dev =get_ocrdma_dev (device); -snprintf (str, str_len,"%s" , &dev->attr.fw_ver[0 ]); +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%s" , &dev->attr.fw_ver[0 ]); }static int ocrdma_register_device (struct ocrdma_dev *dev)
drivers/infiniband/hw/qedr/main.c +2 -3
@@ -69,13 +69,12 @@ static enum rdma_link_layer qedr_link_layer(struct ib_device *device,return IB_LINK_LAYER_ETHERNET ; } -static void qedr_get_dev_fw_str (struct ib_device *ibdev,char *str, -size_t str_len) +static void qedr_get_dev_fw_str (struct ib_device *ibdev,char *str) {struct qedr_dev *qedr =get_qedr_dev (ibdev);u32 fw_ver = (u32 )qedr->attr.fw_ver; -snprintf (str, str_len,"%d. %d. %d. %d" , +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d. %d. %d. %d" , (fw_ver >>24 ) &0xFF , (fw_ver >>16 ) &0xFF , (fw_ver >>8 ) &0xFF , fw_ver &0xFF ); }
drivers/infiniband/hw/usnic/usnic_ib_main.c +2 -4
@@ -333,9 +333,7 @@ static int usnic_port_immutable(struct ib_device *ibdev, u8 port_num,return 0 ; } -static void usnic_get_dev_fw_str (struct ib_device *device, -char *str, -size_t str_len) +static void usnic_get_dev_fw_str (struct ib_device *device,char *str) {struct usnic_ib_dev *us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev);
@@ -345,7 +343,7 @@ static void usnic_get_dev_fw_str(struct ib_device *device, us_ibdev->netdev->ethtool_ops->get_drvinfo (us_ibdev->netdev, &info);mutex_unlock (&us_ibdev->usdev_lock); -snprintf (str, str_len,"%s" , info.fw_version); +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%s" , info.fw_version); }/* Start of PF discovery section */
drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c +2 -3
@@ -102,12 +102,11 @@ static struct device_attribute *pvrdma_class_attributes[] = { &dev_attr_board_id }; -static void pvrdma_get_fw_ver_str (struct ib_device *device,char *str, -size_t str_len) +static void pvrdma_get_fw_ver_str (struct ib_device *device,char *str) {struct pvrdma_dev *dev = container_of(device, struct pvrdma_dev, ib_dev); -snprintf (str, str_len,"%d.%d.%d\n" , +snprintf (str,IB_FW_VERSION_NAME_MAX ,"%d.%d.%d\n" , (int ) (dev->dsr->caps.fw_ver >>32 ), (int ) (dev->dsr->caps.fw_ver >>16 ) &0xffff , (int ) dev->dsr->caps.fw_ver &0xffff );
drivers/infiniband/ulp/ipoib/ipoib_ethtool.c +1 -2
@@ -62,8 +62,7 @@ static void ipoib_get_drvinfo(struct net_device *netdev, {struct ipoib_dev_priv *priv =ipoib_priv (netdev); -ib_get_device_fw_str (priv->ca, drvinfo->fw_version, -sizeof (drvinfo->fw_version)); +ib_get_device_fw_str (priv->ca, drvinfo->fw_version);strlcpy (drvinfo->bus_info,dev_name (priv->ca->dev.parent),sizeof (drvinfo->bus_info));
include/rdma/ib_verbs.h +4 -2
@@ -64,6 +64,8 @@#include <linux/cgroup_rdma.h> #include <uapi/rdma/ib_user_verbs.h> +#define IB_FW_VERSION_NAME_MAX ETHTOOL_FWVERS_LEN +extern struct workqueue_struct *ib_wq;extern struct workqueue_struct *ib_comp_wq;
@@ -2246,7 +2248,7 @@ struct ib_device {* in fast paths. */ int (*get_port_immutable)(struct ib_device *,u8 ,struct ib_port_immutable *); -void (*get_dev_fw_str)(struct ib_device *,char *str,size_t str_len); +void (*get_dev_fw_str)(struct ib_device *,char *str); };struct ib_client {
@@ -2282,7 +2284,7 @@ struct ib_client {struct ib_device *ib_alloc_device (size_t size);void ib_dealloc_device (struct ib_device *device); -void ib_get_device_fw_str (struct ib_device *device,char *str,size_t str_len); +void ib_get_device_fw_str (struct ib_device *device,char *str); int ib_register_device(struct ib_device *device, int (*port_callback)(struct ib_device *,
Signature · 1 line
2.13.2
A message that is not in the archive (sent off-list or not yet received): 20170703062830.30361-21-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Dennis Dalessandro
Reviewed-byRe: [PATCH rdma-next V2 20/27] RDMA: Simplify get firmware interface
Quoted 11 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
There is a need to forward FW version to user space application through RDMA netlink. In order to make it safe, there is need to declare
nla_policyand limit the size of FW string.The new define
IB_FW_VERSION_NAME_MAXwill limit the size of FW version string. That define was chosen to be equal toETHTOOL_FWVERS_LEN, because many drivers anyway are limited by that value indirectly.
Quoted 4 lines
The introduction of this define allows us to remove the string size from
get_fw_strfunction signature.
--
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 v2 21/27 RDMA/netlink: Export FW version
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Add FW version to the device properties exported
by RDMA netlink, to be used by RDMAtool.
--- drivers/infiniband/core/nldev.c | 9 +++++++++ include/uapi/rdma/rdma_netlink.h | 4 ++++ 2 files changed, 13 insertions(+)
drivers/infiniband/core/nldev.c +9 -0
@@ -40,10 +40,14 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_DEV_NAME ] = { .type =NLA_NUL_STRING , .len = IB_DEVICE_NAME_MAX - 1}, [RDMA_NLDEV_ATTR_PORT_INDEX] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_FW_VERSION ] = { .type =NLA_NUL_STRING , + .len = IB_FW_VERSION_NAME_MAX - 1}, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device) { +char fw[IB_FW_VERSION_NAME_MAX ]; +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_DEV_INDEX , device->index))return -EMSGSIZE ;if (nla_put_string (msg,RDMA_NLDEV_ATTR_DEV_NAME , device->name))
@@ -56,6 +60,11 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device) device->attrs.device_cap_flags, 0))return -EMSGSIZE ; +ib_get_device_fw_str (device, fw); +/* Device without FW has strlen(fw) */ +if (strlen (fw) &&nla_put_string (msg,RDMA_NLDEV_ATTR_FW_VERSION , fw)) +return -EMSGSIZE ; +return 0 ; }
include/uapi/rdma/rdma_netlink.h +4 -0
@@ -262,6 +262,10 @@ enum rdma_nldev_attr {*/ RDMA_NLDEV_ATTR_CAP_FLAGS ,/* u64 */ +/* +* FW version +*/ +RDMA_NLDEV_ATTR_FW_VERSION ,/* string */ RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 1 line
2.13.2
PATCH v2 22/27 RDMA/netlink: Export node_guid and sys_image_guid
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Add Node GUID and system image GUID to the device properties exported by RDMA netlink, to be used by RDMAtool.
--- drivers/infiniband/core/nldev.c | 8 ++++++++ include/uapi/rdma/rdma_netlink.h | 13 +++++++++++++ 2 files changed, 21 insertions(+)
drivers/infiniband/core/nldev.c +8 -0
@@ -42,6 +42,8 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_PORT_INDEX] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_FW_VERSION ] = { .type =NLA_NUL_STRING , .len = IB_FW_VERSION_NAME_MAX - 1}, + [RDMA_NLDEV_ATTR_NODE_GUID] = { .type = NLA_U64 }, + [RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = { .type = NLA_U64 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)
@@ -65,6 +67,12 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device)if (strlen (fw) &&nla_put_string (msg,RDMA_NLDEV_ATTR_FW_VERSION , fw))return -EMSGSIZE ; +if (nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_NODE_GUID , +be64_to_cpu (device->node_guid),0 )) +return -EMSGSIZE ; +if (nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_SYS_IMAGE_GUID , +be64_to_cpu (device->attrs.sys_image_guid),0 )) +return -EMSGSIZE ;return 0 ; }
include/uapi/rdma/rdma_netlink.h +13 -0
@@ -266,6 +266,19 @@ enum rdma_nldev_attr {* FW version */ RDMA_NLDEV_ATTR_FW_VERSION ,/* string */ + +/* +* Node GUID (in host byte order) associated with the RDMA device. +*/ +RDMA_NLDEV_ATTR_NODE_GUID ,/* u64 */ + +/* +* System image GUID (in host byte order) associated with +* this RDMA device and other devices which are part of a +* single system. +*/ +RDMA_NLDEV_ATTR_SYS_IMAGE_GUID ,/* u64 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 1 line
2.13.2
PATCH v2 24/27 RDMA/netink: Export lids and sm_lids
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
According to the IB specification, the LID and SM_LID are 16-bit wide, but to support OmniPath users, export it as 32-bit value from the beginning.
--- drivers/infiniband/core/nldev.c | 9 ++++++++- include/uapi/rdma/rdma_netlink.h | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-)
drivers/infiniband/core/nldev.c +8 -1
@@ -45,6 +45,8 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_NODE_GUID] = { .type = NLA_U64 }, [RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = { .type = NLA_U64 }, [RDMA_NLDEV_ATTR_SUBNET_PREFIX] = { .type = NLA_U64 }, + [RDMA_NLDEV_ATTR_LID] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_SM_LID] = { .type = NLA_U32 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)
@@ -102,7 +104,12 @@ static int fill_port_info(struct sk_buff *msg,nla_put_u64_64bit (msg,RDMA_NLDEV_ATTR_SUBNET_PREFIX , attr.subnet_prefix, 0)) return -EMSGSIZE; - +if (rdma_protocol_ib (device, port)) { +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_LID , attr.lid)) +return -EMSGSIZE ; +if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_SM_LID , attr.sm_lid)) +return -EMSGSIZE ; + }return 0 ; }
include/uapi/rdma/rdma_netlink.h +8 -0
@@ -284,6 +284,14 @@ enum rdma_nldev_attr {*/ RDMA_NLDEV_ATTR_SUBNET_PREFIX ,/* u64 */ +/* +* Local Identifier (LID), +* According to IB specification, It is 16-bit address assigned +* by the Subnet Manager. Extended to be 32-bit for OmniPath users. +*/ +RDMA_NLDEV_ATTR_LID ,/* u32 */ +RDMA_NLDEV_ATTR_SM_LID ,/* u32 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 1 line
2.13.2
A message that is not in the archive (sent off-list or not yet received): 20170703062830.30361-25-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Dennis Dalessandro
Reviewed-byRe: [PATCH rdma-next V2 24/27] RDMA/netink: Export lids and sm_lids
Quoted 8 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
According to the IB specification, the LID and
SM_LIDare 16-bit wide, but to support OmniPath users, export it as 32-bit value from the beginning.---
--
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 v2 25/27 RDMA/netlink: Export LID mask counter (LMC)
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
--- drivers/infiniband/core/nldev.c | 3 +++ include/uapi/rdma/rdma_netlink.h | 5 +++++ 2 files changed, 8 insertions(+)
drivers/infiniband/core/nldev.c +3 -0
@@ -47,6 +47,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_SUBNET_PREFIX] = { .type = NLA_U64 }, [RDMA_NLDEV_ATTR_LID] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_SM_LID] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_LMC] = { .type = NLA_U8 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)
@@ -109,6 +110,8 @@ static int fill_port_info(struct sk_buff *msg,return -EMSGSIZE ;if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_SM_LID , attr.sm_lid))return -EMSGSIZE ; +if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_LMC , attr.lmc)) +return -EMSGSIZE ; }return 0 ; }
include/uapi/rdma/rdma_netlink.h +5 -0
@@ -292,6 +292,11 @@ enum rdma_nldev_attr {RDMA_NLDEV_ATTR_LID ,/* u32 */ RDMA_NLDEV_ATTR_SM_LID ,/* u32 */ +/* +* LID mask count (LMC) +*/ +RDMA_NLDEV_ATTR_LMC ,/* u8 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 1 line
2.13.2
Re: [PATCH rdma-next V2 25/27] RDMA/netlink: Export LID mask counter (LMC)
Quoted 36 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Signed-off-by Leon Romanovsky <[email protected]>--- drivers/infiniband/core/nldev.c | 3 +++ include/uapi/rdma/rdma_netlink.h | 5 +++++ 2 files changed, 8 insertions(+)drivers/infiniband/core/nldev.c +3
-0@@ -47,6 +47,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_SUBNET_PREFIX] = { .type = NLA_U64 }, [RDMA_NLDEV_ATTR_LID] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_SM_LID] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_LMC] = { .type = NLA_U8 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)@@ -109,6 +110,8 @@ static int fill_port_info(struct sk_buff *msg,return -EMSGSIZE ;if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_SM_LID , attr.sm_lid))return -EMSGSIZE ; +if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_LMC , attr.lmc)) +return -EMSGSIZE ; }return 0 ; }include/uapi/rdma/rdma_netlink.h +0
-0@@ -292,6 +292,11 @@ enum rdma_nldev_attr { RDMA_NLDEV_ATTR_LID, /* u32 */
include/uapi/rdma/rdma_netlink.h enum rdma_nldev_attr { · line 302
Quoted 10 lines
include/uapi/rdma/rdma_netlink.h +5
-0RDMA_NLDEV_ATTR_SM_LID ,/* u32 */ +/* +* LID mask count (LMC) +*/ +RDMA_NLDEV_ATTR_LMC ,/* u8 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
LMC = "Counter" or "Control"? I always thought it was the latter.
-Denny
Re: [PATCH rdma-next V2 25/27] RDMA/netlink: Export LID mask counter (LMC)
Quoted 39 lines · Dennis Dalessandro
Quoted 38 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Signed-off-by Leon Romanovsky <[email protected]>--- drivers/infiniband/core/nldev.c | 3 +++ include/uapi/rdma/rdma_netlink.h | 5 +++++ 2 files changed, 8 insertions(+)drivers/infiniband/core/nldev.c +3
-0@@ -47,6 +47,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_SUBNET_PREFIX] = { .type = NLA_U64 }, [RDMA_NLDEV_ATTR_LID] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_SM_LID] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_LMC] = { .type = NLA_U8 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)@@ -109,6 +110,8 @@ static int fill_port_info(struct sk_buff *msg,return -EMSGSIZE ;if (nla_put_u32 (msg,RDMA_NLDEV_ATTR_SM_LID , attr.sm_lid))return -EMSGSIZE ; +if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_LMC , attr.lmc)) +return -EMSGSIZE ; }return 0 ; }include/uapi/rdma/rdma_netlink.h +3
-0@@ -292,6 +292,11 @@ enum rdma_nldev_attr {RDMA_NLDEV_ATTR_LID ,/* u32 */ RDMA_NLDEV_ATTR_SM_LID, /* u32 */ +/* +* LID mask count (LMC) +*/
Quoted 8 lines
include/uapi/rdma/rdma_netlink.h enum rdma_nldev_attr {
Quoted 6 lines
include/uapi/rdma/rdma_netlink.h +2
-0+RDMA_NLDEV_ATTR_LMC ,/* u8 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */ LMC = "Counter" or "Control"? I always thought it was the latter.
You are right, it is control.
From spec:
LID Mask Control - A per-port value assigned by the Subnet Manager. The value of the LMC specifies the number of Path Bits in the Local Identifier.
I don't know why I called it "counter".
It is wrong comment and not something else, so I'll wait till Doug's branches will be ready and send fix after that.
Thanks
Quoted 2 lines
-Denny
PATCH v2 26/27 RDMA/netlink: Provide port state and physical link state
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Add port state and physical link state to the users of RDMA netlink.
--- drivers/infiniband/core/nldev.c | 6 ++++++ include/uapi/rdma/rdma_netlink.h | 3 +++ 2 files changed, 9 insertions(+)
drivers/infiniband/core/nldev.c +6 -0
@@ -48,6 +48,8 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_LID] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_SM_LID] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_LMC] = { .type = NLA_U8 }, + [RDMA_NLDEV_ATTR_PORT_STATE] = { .type = NLA_U8 }, + [RDMA_NLDEV_ATTR_PORT_PHYS_STATE] = { .type = NLA_U8 }, };static int fill_dev_info (struct sk_buff *msg,struct ib_device *device)
@@ -113,6 +115,10 @@ static int fill_port_info(struct sk_buff *msg,if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_LMC , attr.lmc))return -EMSGSIZE ; } +if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_PORT_STATE , attr.state)) +return -EMSGSIZE ; +if (nla_put_u8 (msg,RDMA_NLDEV_ATTR_PORT_PHYS_STATE , attr.phys_state)) +return -EMSGSIZE ;return 0 ; }
include/uapi/rdma/rdma_netlink.h +3 -0
@@ -297,6 +297,9 @@ enum rdma_nldev_attr {*/ RDMA_NLDEV_ATTR_LMC ,/* u8 */ +RDMA_NLDEV_ATTR_PORT_STATE ,/* u8 */ +RDMA_NLDEV_ATTR_PORT_PHYS_STATE ,/* u8 */ +RDMA_NLDEV_ATTR_MAX };#endif /* _UAPI_RDMA_NETLINK_H */
Signature · 1 line
2.13.2