Skip to content

Commit c990172

Browse files
Leon Romanovskyrleon
authored andcommitted
RDMA/netlink: Remove netlink clients infrastructure
RDMA netlink has a complicated infrastructure for dynamically registering and de-registering netlink clients to the NETLINK_RDMA group. The complicated portion of this code is not widely used because 2 of the 3 current clients are statically compiled together with netlink.c. The infrastructure, therefore, is deemed overkill. Refactor the code to eliminate the dynamically added clients. Now all clients are pre-registered in a client array at compile time, and at run time they merely check-in with the infrastructure to pass their callback table for inclusion in the pre-sized client array. This also allows for future cleanups and removal of unneeded code in the iwcm* netlink handler. Signed-off-by: Leon Romanovsky <[email protected]> Reviewed-by: Chien Tin Tung <[email protected]>
1 parent 9047811 commit c990172

File tree

6 files changed

+112
-151
lines changed

6 files changed

+112
-151
lines changed

drivers/infiniband/core/cma.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4512,9 +4512,7 @@ static int __init cma_init(void)
45124512
if (ret)
45134513
goto err;
45144514

4515-
if (ibnl_add_client(RDMA_NL_RDMA_CM, ARRAY_SIZE(cma_cb_table),
4516-
cma_cb_table))
4517-
pr_warn("RDMA CMA: failed to add netlink callback\n");
4515+
rdma_nl_register(RDMA_NL_RDMA_CM, cma_cb_table);
45184516
cma_configfs_init();
45194517

45204518
return 0;
@@ -4531,7 +4529,7 @@ static int __init cma_init(void)
45314529
static void __exit cma_cleanup(void)
45324530
{
45334531
cma_configfs_exit();
4534-
ibnl_remove_client(RDMA_NL_RDMA_CM);
4532+
rdma_nl_unregister(RDMA_NL_RDMA_CM);
45354533
ib_unregister_client(&cma_client);
45364534
unregister_netdevice_notifier(&cma_nb);
45374535
rdma_addr_unregister_client(&addr_client);

drivers/infiniband/core/core_priv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ void ib_mad_cleanup(void);
179179
int ib_sa_init(void);
180180
void ib_sa_cleanup(void);
181181

182-
int ibnl_init(void);
183-
void ibnl_cleanup(void);
182+
int rdma_nl_init(void);
183+
void rdma_nl_exit(void);
184184

185185
/**
186186
* Check if there are any listeners to the netlink group

drivers/infiniband/core/device.c

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,29 +1086,15 @@ struct net_device *ib_get_net_dev_by_params(struct ib_device *dev,
10861086
}
10871087
EXPORT_SYMBOL(ib_get_net_dev_by_params);
10881088

1089-
static struct ibnl_client_cbs ibnl_ls_cb_table[] = {
1089+
static const struct ibnl_client_cbs ibnl_ls_cb_table[] = {
10901090
[RDMA_NL_LS_OP_RESOLVE] = {
1091-
.dump = ib_nl_handle_resolve_resp,
1092-
.module = THIS_MODULE },
1091+
.dump = ib_nl_handle_resolve_resp},
10931092
[RDMA_NL_LS_OP_SET_TIMEOUT] = {
1094-
.dump = ib_nl_handle_set_timeout,
1095-
.module = THIS_MODULE },
1093+
.dump = ib_nl_handle_set_timeout},
10961094
[RDMA_NL_LS_OP_IP_RESOLVE] = {
1097-
.dump = ib_nl_handle_ip_res_resp,
1098-
.module = THIS_MODULE },
1095+
.dump = ib_nl_handle_ip_res_resp},
10991096
};
11001097

1101-
static int ib_add_ibnl_clients(void)
1102-
{
1103-
return ibnl_add_client(RDMA_NL_LS, ARRAY_SIZE(ibnl_ls_cb_table),
1104-
ibnl_ls_cb_table);
1105-
}
1106-
1107-
static void ib_remove_ibnl_clients(void)
1108-
{
1109-
ibnl_remove_client(RDMA_NL_LS);
1110-
}
1111-
11121098
static int __init ib_core_init(void)
11131099
{
11141100
int ret;
@@ -1130,9 +1116,9 @@ static int __init ib_core_init(void)
11301116
goto err_comp;
11311117
}
11321118

1133-
ret = ibnl_init();
1119+
ret = rdma_nl_init();
11341120
if (ret) {
1135-
pr_warn("Couldn't init IB netlink interface\n");
1121+
pr_warn("Couldn't init IB netlink interface: err %d\n", ret);
11361122
goto err_sysfs;
11371123
}
11381124

@@ -1154,32 +1140,25 @@ static int __init ib_core_init(void)
11541140
goto err_mad;
11551141
}
11561142

1157-
ret = ib_add_ibnl_clients();
1158-
if (ret) {
1159-
pr_warn("Couldn't register ibnl clients\n");
1160-
goto err_sa;
1161-
}
1162-
11631143
ret = register_lsm_notifier(&ibdev_lsm_nb);
11641144
if (ret) {
11651145
pr_warn("Couldn't register LSM notifier. ret %d\n", ret);
1166-
goto err_ibnl_clients;
1146+
goto err_sa;
11671147
}
11681148

1149+
rdma_nl_register(RDMA_NL_LS, ibnl_ls_cb_table);
11691150
ib_cache_setup();
11701151

11711152
return 0;
11721153

1173-
err_ibnl_clients:
1174-
ib_remove_ibnl_clients();
11751154
err_sa:
11761155
ib_sa_cleanup();
11771156
err_mad:
11781157
ib_mad_cleanup();
11791158
err_addr:
11801159
addr_cleanup();
11811160
err_ibnl:
1182-
ibnl_cleanup();
1161+
rdma_nl_exit();
11831162
err_sysfs:
11841163
class_unregister(&ib_class);
11851164
err_comp:
@@ -1191,13 +1170,13 @@ static int __init ib_core_init(void)
11911170

11921171
static void __exit ib_core_cleanup(void)
11931172
{
1194-
unregister_lsm_notifier(&ibdev_lsm_nb);
11951173
ib_cache_cleanup();
1196-
ib_remove_ibnl_clients();
1174+
rdma_nl_unregister(RDMA_NL_LS);
1175+
unregister_lsm_notifier(&ibdev_lsm_nb);
11971176
ib_sa_cleanup();
11981177
ib_mad_cleanup();
11991178
addr_cleanup();
1200-
ibnl_cleanup();
1179+
rdma_nl_exit();
12011180
class_unregister(&ib_class);
12021181
destroy_workqueue(ib_comp_wq);
12031182
/* Make sure that any pending umem accounting work is done. */

drivers/infiniband/core/iwcm.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,12 +1175,8 @@ static int __init iw_cm_init(void)
11751175
ret = iwpm_init(RDMA_NL_IWCM);
11761176
if (ret)
11771177
pr_err("iw_cm: couldn't init iwpm\n");
1178-
1179-
ret = ibnl_add_client(RDMA_NL_IWCM, ARRAY_SIZE(iwcm_nl_cb_table),
1180-
iwcm_nl_cb_table);
1181-
if (ret)
1182-
pr_err("iw_cm: couldn't register netlink callbacks\n");
1183-
1178+
else
1179+
rdma_nl_register(RDMA_NL_IWCM, iwcm_nl_cb_table);
11841180
iwcm_wq = alloc_ordered_workqueue("iw_cm_wq", WQ_MEM_RECLAIM);
11851181
if (!iwcm_wq)
11861182
return -ENOMEM;
@@ -1200,7 +1196,7 @@ static void __exit iw_cm_cleanup(void)
12001196
{
12011197
unregister_net_sysctl_table(iwcm_ctl_table_hdr);
12021198
destroy_workqueue(iwcm_wq);
1203-
ibnl_remove_client(RDMA_NL_IWCM);
1199+
rdma_nl_unregister(RDMA_NL_IWCM);
12041200
iwpm_exit(RDMA_NL_IWCM);
12051201
}
12061202

0 commit comments

Comments
 (0)