Commit 993b858e authored by Jon Paul Maloy's avatar Jon Paul Maloy Committed by David S. Miller

tipc: correct the order of stopping services at rmmod

The 'signal handler' service in TIPC is a mechanism that makes it
possible to postpone execution of functions, by launcing them into
a job queue for execution in a separate tasklet, independent of
the launching execution thread.

When we do rmmod on the tipc module, this service is stopped after
the network service. At the same time, the stopping of the network
service may itself launch jobs for execution, with the risk that these
functions may be scheduled for execution after the data structures
meant to be accessed by the job have already been deleted. We have
seen this happen, most often resulting in an oops.

This commit ensures that the signal handler is the very first to be
stopped when TIPC is shut down, so there are no surprises during
the cleanup of the other services.
Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Reviewed-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 388d3335
...@@ -113,7 +113,6 @@ int tipc_core_start_net(unsigned long addr) ...@@ -113,7 +113,6 @@ int tipc_core_start_net(unsigned long addr)
static void tipc_core_stop(void) static void tipc_core_stop(void)
{ {
tipc_netlink_stop(); tipc_netlink_stop();
tipc_handler_stop();
tipc_cfg_stop(); tipc_cfg_stop();
tipc_subscr_stop(); tipc_subscr_stop();
tipc_nametbl_stop(); tipc_nametbl_stop();
...@@ -146,9 +145,10 @@ static int tipc_core_start(void) ...@@ -146,9 +145,10 @@ static int tipc_core_start(void)
res = tipc_subscr_start(); res = tipc_subscr_start();
if (!res) if (!res)
res = tipc_cfg_init(); res = tipc_cfg_init();
if (res) if (res) {
tipc_handler_stop();
tipc_core_stop(); tipc_core_stop();
}
return res; return res;
} }
...@@ -178,6 +178,7 @@ static int __init tipc_init(void) ...@@ -178,6 +178,7 @@ static int __init tipc_init(void)
static void __exit tipc_exit(void) static void __exit tipc_exit(void)
{ {
tipc_handler_stop();
tipc_core_stop_net(); tipc_core_stop_net();
tipc_core_stop(); tipc_core_stop();
pr_info("Deactivated\n"); pr_info("Deactivated\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment