Commit e677b72a authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jason Gunthorpe
Browse files

RDMA/iwcm: Release resources if iw_cm module initialization fails

The failure during iw_cm module initialization partially left the system
with unreleased memory and other resources. Rewrite the module init/exit
routines in such way that netlink commands will be opened only after
successful initialization.

Fixes: b493d91d ("iwcm: common code for port mapper")
Link: https://lore.kernel.org/r/b01239f99cb1a3e6d2b0694c242d89e6410bcd93.1627048781.git.leonro@nvidia.com


Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent a0293eb2
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -1186,29 +1186,34 @@ static int __init iw_cm_init(void)

	ret = iwpm_init(RDMA_NL_IWCM);
	if (ret)
		pr_err("iw_cm: couldn't init iwpm\n");
	else
		rdma_nl_register(RDMA_NL_IWCM, iwcm_nl_cb_table);
		return ret;

	iwcm_wq = alloc_ordered_workqueue("iw_cm_wq", 0);
	if (!iwcm_wq)
		return -ENOMEM;
		goto err_alloc;

	iwcm_ctl_table_hdr = register_net_sysctl(&init_net, "net/iw_cm",
						 iwcm_ctl_table);
	if (!iwcm_ctl_table_hdr) {
		pr_err("iw_cm: couldn't register sysctl paths\n");
		destroy_workqueue(iwcm_wq);
		return -ENOMEM;
		goto err_sysctl;
	}

	rdma_nl_register(RDMA_NL_IWCM, iwcm_nl_cb_table);
	return 0;

err_sysctl:
	destroy_workqueue(iwcm_wq);
err_alloc:
	iwpm_exit(RDMA_NL_IWCM);
	return -ENOMEM;
}

static void __exit iw_cm_cleanup(void)
{
	rdma_nl_unregister(RDMA_NL_IWCM);
	unregister_net_sysctl_table(iwcm_ctl_table_hdr);
	destroy_workqueue(iwcm_wq);
	rdma_nl_unregister(RDMA_NL_IWCM);
	iwpm_exit(RDMA_NL_IWCM);
}