xfrm: avoid synchronize_rcu during netns destruction

Use the new exit_pre hook to NULL the netlink socket.
The net namespace core will do a synchronize_rcu() between the exit_pre
and exit/exit_batch handlers.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
Florian Westphal 2021-04-14 18:12:53 +02:00 committed by Steffen Klassert
parent 7baf867fef
commit 6218fe1861
1 changed files with 7 additions and 3 deletions

View File

@ -3480,18 +3480,22 @@ static int __net_init xfrm_user_net_init(struct net *net)
return 0;
}
static void __net_exit xfrm_user_net_pre_exit(struct net *net)
{
RCU_INIT_POINTER(net->xfrm.nlsk, NULL);
}
static void __net_exit xfrm_user_net_exit(struct list_head *net_exit_list)
{
struct net *net;
list_for_each_entry(net, net_exit_list, exit_list)
RCU_INIT_POINTER(net->xfrm.nlsk, NULL);
synchronize_net();
list_for_each_entry(net, net_exit_list, exit_list)
netlink_kernel_release(net->xfrm.nlsk_stash);
}
static struct pernet_operations xfrm_user_net_ops = {
.init = xfrm_user_net_init,
.pre_exit = xfrm_user_net_pre_exit,
.exit_batch = xfrm_user_net_exit,
};