Refactor RDMA netlink infrastructure
v2 cover Refactor RDMA netlink infrastructure
The following patch set is a preparation to addition of netlink handlers to support RDMA tool. It simplifies the code, removes useless client infrastructure, concentrates netlink validity checks and allows future patches to remove a lot of dead code from iwcm* code base (all operations related to nl_clients).
It is based on already sent to the mailing list patch [1] "Revert "IB/core: Add flow control to the portmapper netlink calls""
[1] https://patchwork.kernel.org/patch/9752865/
Changelog v1->v2:
* Added Chien's ROB tags
Patch #1:
* Annotate max_num_ops with "static const" to calculate the value once only.
Changelog v0->v1:
* Moved to separate topic from rdmatool.
Patch #1:
* Add check to catch already initialized callback table to avoid double registration of the same protocol.
* Rewrite the validity check to use array instead of switch().
Available in the "topic/betlink-refactor-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/netlink-refactor-v2
Leon Romanovsky (5):
RDMA/netlink: Remove netlink clients infrastructure RDMA/netlink: Remove redundant owner option for netlink callbacks RDMA/netlink: Avoid double pass for RDMA netlink messages RDMA/iwcm: Remove useless check of nelink client validity RDMA/iwcm: Remove extra EXPORT_SYMBOLS
drivers/infiniband/core/cma.c | 9 +- drivers/infiniband/core/device.c | 41 ++---- drivers/infiniband/core/iwcm.c | 10 +- drivers/infiniband/core/iwpm_msg.c | 12 -- drivers/infiniband/core/iwpm_util.c | 11 -- drivers/infiniband/core/netlink.c | 249 +++++++++++++++++++----------------- include/rdma/rdma_netlink.h | 18 +-- 7 files changed, 155 insertions(+), 195 deletions(-)
--
2.12.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
A message that is not in the archive (sent off-list or not yet received): 20170613085927.2908-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH v2 1/5 RDMA/netlink: Remove netlink clients infrastructure
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink has complicated infrastructure to add and remove netlink clients to NETLINK_RDMA family. This complicates the code and not in use because not many clients are available (3 clients) and most of them (2 clients) are statically compiled together with netlink.c.
The following patch refactors RDMA netlink and opens door for the future patches which will be able to get rid of a lot of dead iwcm* code.
--- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 41 +++------ drivers/infiniband/core/iwcm.c | 10 +-- drivers/infiniband/core/netlink.c | 185 ++++++++++++++++++-------------------- include/rdma/rdma_netlink.h | 17 ++-- 5 files changed, 110 insertions(+), 149 deletions(-)
drivers/infiniband/core/cma.c +2 -4
@@ -4531,9 +4531,7 @@ static int __init cma_init(void)if (ret) goto err; -if (ibnl_add_client (RDMA_NL_RDMA_CM ,ARRAY_SIZE (cma_cb_table), - cma_cb_table)) -pr_warn ("RDMA CMA: failed to add netlink callback\n" ); +rdma_nl_register (RDMA_NL_RDMA_CM , cma_cb_table);cma_configfs_init ();return 0 ;
@@ -4550,7 +4548,7 @@ static int __init cma_init(void) static void __exit cma_cleanup(void) {cma_configfs_exit (); -ibnl_remove_client (RDMA_NL_RDMA_CM ); +rdma_nl_unregister (RDMA_NL_RDMA_CM );ib_unregister_client (&cma_client);unregister_netdevice_notifier (&cma_nb);rdma_addr_unregister_client (&addr_client);
drivers/infiniband/core/device.c +10 -31
83 lines not on this page · raw message
drivers/infiniband/core/iwcm.c +3 -7
@@ -1175,12 +1175,8 @@ static int __init iw_cm_init(void) ret =iwpm_init (RDMA_NL_IWCM );if (ret)pr_err ("iw_cm: couldn't init iwpm\n" ); - - ret =ibnl_add_client (RDMA_NL_IWCM ,ARRAY_SIZE (iwcm_nl_cb_table), - iwcm_nl_cb_table); -if (ret) -pr_err ("iw_cm: couldn't register netlink callbacks\n" ); - +else +rdma_nl_register (RDMA_NL_IWCM , iwcm_nl_cb_table); iwcm_wq =alloc_ordered_workqueue ("iw_cm_wq" ,WQ_MEM_RECLAIM );if (!iwcm_wq)return -ENOMEM ;
@@ -1200,7 +1196,7 @@ static void __exit iw_cm_cleanup(void) {unregister_net_sysctl_table (iwcm_ctl_table_hdr);destroy_workqueue (iwcm_wq); -ibnl_remove_client (RDMA_NL_IWCM ); +rdma_nl_unregister (RDMA_NL_IWCM );iwpm_exit (RDMA_NL_IWCM ); }
drivers/infiniband/core/netlink.c +89 -96
249 lines not on this page · raw message
include/rdma/rdma_netlink.h +6 -11
@@ -10,27 +10,22 @@ struct ibnl_client_cbs {struct module *module; }; -int ibnl_init (void ); -void ibnl_cleanup (void ); +int rdma_nl_init (void ); +void rdma_nl_exit (void );/** -* Add a a client to the list of IB netlink exporters. +* Register client in RDMA netlink. * @index: Index of the added client -* @nops: Number of supported ops by the added client. * @cb_table: A table for op->callback -* -* Returns 0 on success or a negative error code. */ -int ibnl_add_client (int index,int nops, -const struct ibnl_client_cbs cb_table[]); +void rdma_nl_register (unsigned int index, +const struct ibnl_client_cbs cb_table[]);/** * Remove a client from IB netlink. * @index: Index of the removed IB client. -* -* Returns 0 on success or a negative error code. */ -int ibnl_remove_client (int index); +void rdma_nl_unregister (unsigned int index);/** * Put a new message in a supplied skb.
Signature · 6 lines
2.12.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
A message that is not in the archive (sent off-list or not yet received): 20170613085927.2908-2-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Re: [PATCH rdma-next V2 1/5] RDMA/netlink: Remove netlink clients infrastructure
Quoted 25 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink has complicated infrastructure to add and remove netlink clients to
NETLINK_RDMAfamily. This complicates the code and not in use because not many clients are available (3 clients) and most of them (2 clients) are statically compiled together withnetlink.c.The following patch refactors RDMA netlink and opens door for the future patches which will be able to get rid of a lot of dead iwcm* code.
Reviewed-by Chien Tin Tung <[email protected]>--- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 41 +++------ drivers/infiniband/core/iwcm.c | 10 +-- drivers/infiniband/core/netlink.c | 185 ++++++++++++++++++-------------------- include/rdma/rdma_netlink.h | 17 ++-- 5 files changed, 110 insertions(+), 149 deletions(-)include/rdma/rdma_netlink.h +0
-0
include/rdma/rdma_netlink.h struct ibnl_client_cbs { · line 14
Quoted 7 lines
include/rdma/rdma_netlink.h +2
-2@@ -10,27 +10,22 @@ struct ibnl_client_cbs {struct module *module; }; -int ibnl_init (void ); -void ibnl_cleanup (void ); +int rdma_nl_init (void ); +void rdma_nl_exit (void );
This hunk is in direct conflict with 233c1955 which you removed ibnl_init and ibnl_cleanup. Are you putting back the init and exit or do you want to leave them out?
Chien
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170626175505.GA2904-TZeIlv3TuzOfrEmaQUPKxl95YUYmaKo1UNDiOz3kqAs@public.gmane.org
Re: [PATCH rdma-next V2 1/5] RDMA/netlink: Remove netlink clients infrastructure
Quoted 29 lines · Chien Tin Tung
Quoted 28 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink has complicated infrastructure to add and remove netlink clients to
NETLINK_RDMAfamily. This complicates the code and not in use because not many clients are available (3 clients) and most of them (2 clients) are statically compiled together withnetlink.c.The following patch refactors RDMA netlink and opens door for the future patches which will be able to get rid of a lot of dead iwcm* code.
Reviewed-by Chien Tin Tung <[email protected]>--- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 41 +++------ drivers/infiniband/core/iwcm.c | 10 +-- drivers/infiniband/core/netlink.c | 185 ++++++++++++++++++-------------------- include/rdma/rdma_netlink.h | 17 ++-- 5 files changed, 110 insertions(+), 149 deletions(-)include/rdma/rdma_netlink.h +0
-0@@ -10,27 +10,22 @@ struct ibnl_client_cbs {struct module *module; };
Quoted 8 lines
include/rdma/rdma_netlink.h struct ibnl_client_cbs { · line 14
Quoted 4 lines
include/rdma/rdma_netlink.h +2
-2-int ibnl_init (void ); -void ibnl_cleanup (void ); +int rdma_nl_init (void ); +void rdma_nl_exit (void );This hunk is in direct conflict with
233c1955which you removedibnl_initandibnl_cleanup. Are you putting back the init and exit or do you want to leave them out?
We have different git hashes and I don't know about which commit you are referring.
This commit simply renames exit/init functions in general header file. The init/exit is still needed, because it is called from device.c.
The git log doesn't show me anything suspicious too.
➜ linux-rdma git:(topic/rdma-netlink-v1) git log -p include/rdma/rdma_netlink.h
Thanks
Quoted 2 lines
Chien
A message that is not in the archive (sent off-list or not yet received): 20170626181324.GE1248-U/[email protected]
Chien Tin Tung
Reviewed-by Yuval ShaiaRe: [PATCH rdma-next V2 1/5] RDMA/netlink: Remove netlink clients infrastructure
Quoted 39 lines · Leon Romanovsky
Quoted 29 lines · Chien Tin Tung
Quoted 28 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink has complicated infrastructure to add and remove netlink clients to
NETLINK_RDMAfamily. This complicates the code and not in use because not many clients are available (3 clients) and most of them (2 clients) are statically compiled together withnetlink.c.The following patch refactors RDMA netlink and opens door for the future patches which will be able to get rid of a lot of dead iwcm* code.
Reviewed-by Chien Tin Tung <[email protected]>--- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 41 +++------ drivers/infiniband/core/iwcm.c | 10 +-- drivers/infiniband/core/netlink.c | 185 ++++++++++++++++++-------------------- include/rdma/rdma_netlink.h | 17 ++-- 5 files changed, 110 insertions(+), 149 deletions(-)include/rdma/rdma_netlink.h +0
-0@@ -10,27 +10,22 @@ struct ibnl_client_cbs {struct module *module; };Quoted 8 lines
include/rdma/rdma_netlink.h struct ibnl_client_cbs { · line 14
Quoted 4 lines
include/rdma/rdma_netlink.h +2
-2-int ibnl_init (void ); -void ibnl_cleanup (void ); +int rdma_nl_init (void ); +void rdma_nl_exit (void );This hunk is in direct conflict with
233c1955which you removedibnl_initandibnl_cleanup. Are you putting back the init and exit or do you want to leave them out?
Quoted 2 lines
We have different git hashes and I don't know about which commit you are referring.
There is only one true upstream, go look at Linus' git.
Quoted 6 lines
This commit simply renames exit/init functions in general header file. The init/exit is still needed, because it is called from
device.c.The git log doesn't show me anything suspicious too.
➜ linux-rdma git:(topic/rdma-netlink-v1) git log -pinclude/rdma/rdma_netlink.h
Your git and branch is out of sync. This is the relevant part of the patch.
commit 233c1955835bd8649003be9bb3d8e79788b08be1
Author: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]> Date: Sun May 14 15:49:57 2017 +0300
RDMA/netlink: Reduce exposure of RDMA netlink functions
RDMA netlink is part of ib_core, hence ibnl_chk_listeners(), ibnl_init() and ibnl_cleanup() don't need to be published in public header file.
Let's remove EXPORT_SYMBOL from ibnl_chk_listeners() and move all these functions to private header file.
include/rdma/rdma_netlink.h +0 -3
@@ -10,9 +10,6 @@ struct ibnl_client_cbs {struct module *module; }; -int ibnl_init (void ); -void ibnl_cleanup (void ); -
Chien
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170626183329.GA11716-TZeIlv3TuzOfrEmaQUPKxl95YUYmaKo1UNDiOz3kqAs@public.gmane.org
Re: [PATCH rdma-next V2 1/5] RDMA/netlink: Remove netlink clients infrastructure
Quoted 77 lines · Chien Tin Tung
Quoted 39 lines · Leon Romanovsky
Quoted 29 lines · Chien Tin Tung
Quoted 28 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink has complicated infrastructure to add and remove netlink clients to
NETLINK_RDMAfamily. This complicates the code and not in use because not many clients are available (3 clients) and most of them (2 clients) are statically compiled together withnetlink.c.The following patch refactors RDMA netlink and opens door for the future patches which will be able to get rid of a lot of dead iwcm* code.
Reviewed-by Chien Tin Tung <[email protected]>--- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 41 +++------ drivers/infiniband/core/iwcm.c | 10 +-- drivers/infiniband/core/netlink.c | 185 ++++++++++++++++++-------------------- include/rdma/rdma_netlink.h | 17 ++-- 5 files changed, 110 insertions(+), 149 deletions(-)include/rdma/rdma_netlink.h +0
-0@@ -10,27 +10,22 @@ struct ibnl_client_cbs {struct module *module; };Quoted 8 lines
include/rdma/rdma_netlink.h struct ibnl_client_cbs {
Quoted 4 lines
include/rdma/rdma_netlink.h +2
-2-int ibnl_init (void ); -void ibnl_cleanup (void ); +int rdma_nl_init (void ); +void rdma_nl_exit (void );This hunk is in direct conflict with
233c1955which you removedibnl_initandibnl_cleanup. Are you putting back the init and exit or do you want to leave them out?Quoted 2 lines
We have different git hashes and I don't know about which commit you are referring.
There is only one true upstream, go look at Linus' git.
Quoted 6 lines
This commit simply renames exit/init functions in general header file. The init/exit is still needed, because it is called from
device.c.The git log doesn't show me anything suspicious too.
➜ linux-rdma git:(topic/rdma-netlink-v1) git log -pinclude/rdma/rdma_netlink.hYour git and branch is out of sync. This is the relevant part of the patch.
commit
233c1955835bd8649003be9bb3d8e79788b08be1Author: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]> Date: Sun May 14 15:49:57 2017 +0300RDMA/netlink: Reduce exposure of RDMA netlink functions
RDMA netlink is part of
ib_core, henceibnl_chk_listeners(),ibnl_init()andibnl_cleanup()don't need to be published in public header file.Let's remove
EXPORT_SYMBOLfromibnl_chk_listeners()and move all these functions to private header file.CC Yuval Shaia <[email protected]>Reviewed-by Yuval Shaia <[email protected]>Signed-off-by Doug Ledford <[email protected]>include/rdma/rdma_netlink.h +0
-0
include/rdma/rdma_netlink.h struct ibnl_client_cbs { · line 15
Quoted 6 lines
include/rdma/rdma_netlink.h +0
-3@@ -10,9 +10,6 @@ struct ibnl_client_cbs {struct module *module; }; -int ibnl_init (void ); -void ibnl_cleanup (void ); -
Thanks,
It is rebase error, those functions needs to be in core_priv.h. I'll resend.
Quoted 3 lines
Chien
A message that is not in the archive (sent off-list or not yet received): 20170626191154.GG1248-U/[email protected]
Re: [PATCH rdma-next V2 1/5] RDMA/netlink: Remove netlink clients infrastructure
Quoted 81 lines · Leon Romanovsky
Quoted 80 lines · Chien Tin Tung
Quoted 39 lines · Leon Romanovsky
Quoted 29 lines · Chien Tin Tung
Quoted 28 lines · Leon Romanovsky
From: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink has complicated infrastructure to add and remove netlink clients to
NETLINK_RDMAfamily. This complicates the code and not in use because not many clients are available (3 clients) and most of them (2 clients) are statically compiled together withnetlink.c.The following patch refactors RDMA netlink and opens door for the future patches which will be able to get rid of a lot of dead iwcm* code.
Reviewed-by Chien Tin Tung <[email protected]>--- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 41 +++------ drivers/infiniband/core/iwcm.c | 10 +-- drivers/infiniband/core/netlink.c | 185 ++++++++++++++++++-------------------- include/rdma/rdma_netlink.h | 17 ++-- 5 files changed, 110 insertions(+), 149 deletions(-)include/rdma/rdma_netlink.h +0
-0@@ -10,27 +10,22 @@ struct ibnl_client_cbs {struct module *module; };Quoted 8 lines
include/rdma/rdma_netlink.h struct ibnl_client_cbs {
Quoted 4 lines
include/rdma/rdma_netlink.h +2
-2-int ibnl_init (void ); -void ibnl_cleanup (void ); +int rdma_nl_init (void ); +void rdma_nl_exit (void );This hunk is in direct conflict with
233c1955which you removedibnl_initandibnl_cleanup. Are you putting back the init and exit or do you want to leave them out?Quoted 2 lines
We have different git hashes and I don't know about which commit you are referring.
There is only one true upstream, go look at Linus' git.
Quoted 6 lines
This commit simply renames exit/init functions in general header file. The init/exit is still needed, because it is called from
device.c.The git log doesn't show me anything suspicious too.
➜ linux-rdma git:(topic/rdma-netlink-v1) git log -pinclude/rdma/rdma_netlink.hYour git and branch is out of sync. This is the relevant part of the patch.
commit
233c1955835bd8649003be9bb3d8e79788b08be1Author: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]> Date: Sun May 14 15:49:57 2017 +0300RDMA/netlink: Reduce exposure of RDMA netlink functions
RDMA netlink is part of
ib_core, henceibnl_chk_listeners(),ibnl_init()andibnl_cleanup()don't need to be published in public header file.Let's remove
EXPORT_SYMBOLfromibnl_chk_listeners()and move all these functions to private header file.CC Yuval Shaia <[email protected]>Reviewed-by Yuval Shaia <[email protected]>Signed-off-by Doug Ledford <[email protected]>include/rdma/rdma_netlink.h +0
-0@@ -10,9 +10,6 @@ struct ibnl_client_cbs {struct module *module; };
Quoted 7 lines
include/rdma/rdma_netlink.h struct ibnl_client_cbs { · line 15
Quoted 3 lines
include/rdma/rdma_netlink.h +0
-3-int ibnl_init (void ); -void ibnl_cleanup (void ); -Thanks,
It is rebase error, those functions needs to be in
core_priv.h. I'll resend.
I found the reason, this patch set is based on -rc2, rebasing on top of -rc4 solved the issue.
To be on the safe side, I created new topic/rdma-netlink-v2 which is rebased version of topic/rdma-netlink-v1.
Thanks for pointing it.
Quoted 4 lines
Quoted 4 lines
Chien
PATCH v2 2/5 RDMA/netlink: Remove redundant owner option for netlink callbacks
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Owner field is not needed to be set because netlink is part of ib_core which will be unloaded last after all other modules are unloaded.
--- drivers/infiniband/core/cma.c | 3 +-- drivers/infiniband/core/netlink.c | 2 -- include/rdma/rdma_netlink.h | 1 - 3 files changed, 1 insertion(+), 5 deletions(-)
drivers/infiniband/core/cma.c +1 -2
@@ -4478,8 +4478,7 @@ static int cma_get_id_stats(struct sk_buff *skb, struct netlink_callback *cb) }static const struct ibnl_client_cbs cma_cb_table[] = { - [RDMA_NL_RDMA_CM_ID_STATS ] = { .dump = cma_get_id_stats, - .module =THIS_MODULE }, + [RDMA_NL_RDMA_CM_ID_STATS ] = { .dump = cma_get_id_stats}, };static int cma_init_net (struct net *net)
drivers/infiniband/core/netlink.c +0 -2
@@ -180,12 +180,10 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, cb.skb = skb; cb.nlh = nlh; cb.dump = rdma_nl_types[index].cb_table[op].dump; - cb.module = rdma_nl_types[index].cb_table[op].module;return cb.dump (skb, &cb); } c.dump = rdma_nl_types[index].cb_table[op].dump; - c.module = rdma_nl_types[index].cb_table[op].module;return netlink_dump_start (nls, skb, nlh, &c); }
include/rdma/rdma_netlink.h +0 -1
@@ -7,7 +7,6 @@struct ibnl_client_cbs {int (*dump)(struct sk_buff *skb,struct netlink_callback *nlcb); -struct module *module; };int rdma_nl_init (void );
Signature · 6 lines
2.12.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 3/5 RDMA/netlink: Avoid double pass for RDMA netlink messages
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
The standard netlink_rcv_skb function skips messages without NLM_F_REQUEST flag in it, while SA netlink client issues them.
In commit bc10ed7d3d19 ("IB/core: Add rdma netlink helper functions") the local function was introduced to allow such messages.
This led to double pass for every incoming message.
In this patch, we unify that local implementation and netlink_rcv_skb functions, so there will be no need for double pass anymore.
As a outcome, this combined function gained more strict check for NLM_F_REQUEST flag and it is now allowed for SA pathquery client only.
--- drivers/infiniband/core/netlink.c | 62 +++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 18 deletions(-)
drivers/infiniband/core/netlink.c +44 -18
@@ -159,8 +159,8 @@ int ibnl_put_attr(struct sk_buff *skb, struct nlmsghdr *nlh, }EXPORT_SYMBOL (ibnl_put_attr); -static int ibnl_rcv_msg (struct sk_buff *skb,struct nlmsghdr *nlh, -struct netlink_ext_ack *extack) +static int rdma_nl_rcv_msg (struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack) {int type = nlh->nlmsg_type;unsigned int index =RDMA_NL_GET_CLIENT (type);
@@ -187,40 +187,66 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,return netlink_dump_start (nls, skb, nlh, &c); } -static void ibnl_rcv_reply_skb (struct sk_buff *skb) +/* +* This function is similar to netlink_rcv_skb with one exception: +* It calls to the callback for the netlink messages without NLM_F_REQUEST +* flag. These messages are intended for RDMA_NL_LS consumer, so it is allowed +* for that consumer only. +*/ +static int rdma_nl_rcv_skb (struct sk_buff *skb,int (*cb)(struct sk_buff *, +struct nlmsghdr *, +struct netlink_ext_ack *)) { +struct netlink_ext_ack extack = {};struct nlmsghdr *nlh; -int msglen; +int err; -/* -* Process responses until there is no more message or the first -* request. Generally speaking, it is not recommended to mix responses -* with requests. -*/ while (skb->len >=nlmsg_total_size (0 )) { +int msglen; + nlh =nlmsg_hdr (skb); + err =0 ;if (nlh->nlmsg_len <NLMSG_HDRLEN || skb->len < nlh->nlmsg_len) -return ; +return 0 ; -/* Handle response only */ -if (nlh->nlmsg_flags &NLM_F_REQUEST ) -return ; +/* +* Generally speaking, the only requests are handled +* by the kernel, but RDMA_NL_LS is different, because it +* runs backward netlink scheme. Kernel initiates messages +* and waits for reply with data to keep pathrecord cache +* in sync. +*/ +if (!(nlh->nlmsg_flags &NLM_F_REQUEST ) && + (RDMA_NL_GET_CLIENT (nlh->nlmsg_type) !=RDMA_NL_LS )) + goto ack; + +/* Skip control messages */ +if (nlh->nlmsg_type <NLMSG_MIN_TYPE ) + goto ack; + + err =cb (skb, nlh, &extack); +if (err == -EINTR ) + goto skip; -ibnl_rcv_msg (skb, nlh,NULL ); +ack: +if (nlh->nlmsg_flags &NLM_F_ACK || err) +netlink_ack (skb, nlh, err, &extack); +skip: msglen =NLMSG_ALIGN (nlh->nlmsg_len);if (msglen > skb->len) msglen = skb->len;skb_pull (skb, msglen); } + +return 0 ; } -static void ibnl_rcv (struct sk_buff *skb) +static void rdma_nl_rcv (struct sk_buff *skb) {mutex_lock (&rdma_nl_mutex); -ibnl_rcv_reply_skb (skb); -netlink_rcv_skb (skb, &ibnl_rcv_msg); +rdma_nl_rcv_skb (skb, &rdma_nl_rcv_msg);mutex_unlock (&rdma_nl_mutex); }
@@ -241,7 +267,7 @@ EXPORT_SYMBOL(ibnl_multicast);int __init rdma_nl_init (void ) {struct netlink_kernel_cfg cfg = { - .input = ibnl_rcv, + .input = rdma_nl_rcv, }; nls =netlink_kernel_create (&init_net,NETLINK_RDMA , &cfg);
Signature · 6 lines
2.12.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 4/5 RDMA/iwcm: Remove useless check of nelink client validity
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
RDMA netlink implementation guarantees that supplied client number is in allowed range.
--- drivers/infiniband/core/iwpm_util.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/infiniband/core/iwpm_util.c +0 -6
@@ -54,8 +54,6 @@ static struct iwpm_admin_data iwpm_admin;int iwpm_init (u8 nl_client) {int ret =0 ; -if (iwpm_valid_client (nl_client)) -return -EINVAL ;mutex_lock (&iwpm_admin_lock);if (atomic_read (&iwpm_admin.refcount) ==0 ) { iwpm_hash_bucket = kzalloc(IWPM_MAPINFO_HASH_SIZE *
@@ -383,15 +381,11 @@ int iwpm_get_nlmsg_seq(void)int iwpm_valid_client (u8 nl_client) { -if (nl_client >=RDMA_NL_NUM_CLIENTS ) -return 0 ;return iwpm_admin.client_list[nl_client]; }void iwpm_set_valid (u8 nl_client,int valid) { -if (nl_client >=RDMA_NL_NUM_CLIENTS ) -return ; iwpm_admin.client_list[nl_client] = valid; }
Signature · 6 lines
2.12.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/5 RDMA/iwcm: Remove extra EXPORT_SYMBOLS
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
The iwcm exports functions which are not used outside of ib_core. This patch simply removes these EXPORT_SYMBOLS.
--- drivers/infiniband/core/iwpm_msg.c | 12 ------------ drivers/infiniband/core/iwpm_util.c | 5 ----- 2 files changed, 17 deletions(-)
drivers/infiniband/core/iwpm_msg.c +0 -12
@@ -42,7 +42,6 @@ int iwpm_valid_pid(void) {return iwpm_user_pid >0 ; } -EXPORT_SYMBOL (iwpm_valid_pid);/* * iwpm_register_pid - Send a netlink query to user space
@@ -122,7 +121,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)iwpm_free_nlmsg_request (&nlmsg_request->kref);return ret; } -EXPORT_SYMBOL (iwpm_register_pid);/* * iwpm_add_mapping - Send a netlink add mapping message
@@ -191,7 +189,6 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client)iwpm_free_nlmsg_request (&nlmsg_request->kref);return ret; } -EXPORT_SYMBOL (iwpm_add_mapping);/* * iwpm_add_and_query_mapping - Send a netlink add and query
@@ -267,7 +264,6 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client)iwpm_free_nlmsg_request (&nlmsg_request->kref);return ret; } -EXPORT_SYMBOL (iwpm_add_and_query_mapping);/* * iwpm_remove_mapping - Send a netlink remove mapping message
@@ -328,7 +324,6 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client)dev_kfree_skb_any (skb);return ret; } -EXPORT_SYMBOL (iwpm_remove_mapping);/* netlink attribute policy for the received response to register pid request */ static const struct nla_policy resp_reg_policy[IWPM_NLA_RREG_PID_MAX ] = {
@@ -397,7 +392,6 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)up (&nlmsg_request->sem);return 0 ; } -EXPORT_SYMBOL (iwpm_register_pid_cb);/* netlink attribute policy for the received response to add mapping request */ static const struct nla_policy resp_add_policy[IWPM_NLA_RMANAGE_MAPPING_MAX ] = {
@@ -466,7 +460,6 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)up (&nlmsg_request->sem);return 0 ; } -EXPORT_SYMBOL (iwpm_add_mapping_cb);/* netlink attribute policy for the response to add and query mapping request * and response with remote address info */
@@ -558,7 +551,6 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,up (&nlmsg_request->sem);return 0 ; } -EXPORT_SYMBOL (iwpm_add_and_query_mapping_cb);/* * iwpm_remote_info_cb - Process a port mapper message, containing
@@ -627,7 +619,6 @@ int iwpm_remote_info_cb(struct sk_buff *skb, struct netlink_callback *cb) "remote_info: Mapped remote sockaddr:");return ret; } -EXPORT_SYMBOL (iwpm_remote_info_cb);/* netlink attribute policy for the received request for mapping info */ static const struct nla_policy resp_mapinfo_policy[IWPM_NLA_MAPINFO_REQ_MAX ] = {
@@ -677,7 +668,6 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) ret =iwpm_send_mapinfo (nl_client, iwpm_user_pid);return ret; } -EXPORT_SYMBOL (iwpm_mapping_info_cb);/* netlink attribute policy for the received mapping info ack */ static const struct nla_policy ack_mapinfo_policy[IWPM_NLA_MAPINFO_NUM_MAX ] = {
@@ -707,7 +697,6 @@ int iwpm_ack_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb)atomic_set (&echo_nlmsg_seq, cb->nlh->nlmsg_seq);return 0 ; } -EXPORT_SYMBOL (iwpm_ack_mapping_info_cb);/* netlink attribute policy for the received port mapper error message */ static const struct nla_policy map_error_policy[IWPM_NLA_ERR_MAX ] = {
@@ -751,4 +740,3 @@ int iwpm_mapping_error_cb(struct sk_buff *skb, struct netlink_callback *cb)up (&nlmsg_request->sem);return 0 ; } -EXPORT_SYMBOL (iwpm_mapping_error_cb);
drivers/infiniband/core/iwpm_util.c +0 -5
@@ -81,7 +81,6 @@ int iwpm_init(u8 nl_client) }return ret; } -EXPORT_SYMBOL (iwpm_init);static void free_hash_bucket (void );static void free_reminfo_bucket (void );
@@ -107,7 +106,6 @@ int iwpm_exit(u8 nl_client)iwpm_set_registration (nl_client,IWPM_REG_UNDEF );return 0 ; } -EXPORT_SYMBOL (iwpm_exit);static struct hlist_head *get_mapinfo_hash_bucket (struct sockaddr_storage *,struct sockaddr_storage *);
@@ -146,7 +144,6 @@ int iwpm_create_mapinfo(struct sockaddr_storage *local_sockaddr,spin_unlock_irqrestore (&iwpm_mapinfo_lock, flags);return ret; } -EXPORT_SYMBOL (iwpm_create_mapinfo);int iwpm_remove_mapinfo (struct sockaddr_storage *local_sockaddr,struct sockaddr_storage *mapped_local_addr)
@@ -182,7 +179,6 @@ int iwpm_remove_mapinfo(struct sockaddr_storage *local_sockaddr,spin_unlock_irqrestore (&iwpm_mapinfo_lock, flags);return ret; } -EXPORT_SYMBOL (iwpm_remove_mapinfo);static void free_hash_bucket (void ) {
@@ -295,7 +291,6 @@ int iwpm_get_remote_info(struct sockaddr_storage *mapped_loc_addr,spin_unlock_irqrestore (&iwpm_reminfo_lock, flags);return ret; } -EXPORT_SYMBOL (iwpm_get_remote_info);struct iwpm_nlmsg_request *iwpm_get_nlmsg_request (__u32 nlmsg_seq,u8 nl_client,gfp_t gfp)
Signature · 6 lines
2.12.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