Skip to content

Commit

Permalink
ipv4: add fib_net_exit_batch()
Browse files Browse the repository at this point in the history
cleanup_net() is competing with other rtnl users.

Instead of acquiring rtnl at each fib_net_exit() invocation,
add fib_net_exit_batch() so that rtnl is acquired once.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Eric Dumazet authored and Jakub Kicinski committed Feb 9, 2022
1 parent fea7b20 commit 1c69576
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions net/ipv4/fib_frontend.c
Original file line number Diff line number Diff line change
@@ -1556,7 +1556,7 @@ static void ip_fib_net_exit(struct net *net)
{
int i;

rtnl_lock();
ASSERT_RTNL();
#ifdef CONFIG_IP_MULTIPLE_TABLES
RCU_INIT_POINTER(net->ipv4.fib_main, NULL);
RCU_INIT_POINTER(net->ipv4.fib_default, NULL);
@@ -1581,7 +1581,7 @@ static void ip_fib_net_exit(struct net *net)
#ifdef CONFIG_IP_MULTIPLE_TABLES
fib4_rules_exit(net);
#endif
rtnl_unlock();

kfree(net->ipv4.fib_table_hash);
fib4_notifier_exit(net);
}
@@ -1608,20 +1608,33 @@ static int __net_init fib_net_init(struct net *net)
out_proc:
nl_fib_lookup_exit(net);
out_nlfl:
rtnl_lock();
ip_fib_net_exit(net);
rtnl_unlock();
goto out;
}

static void __net_exit fib_net_exit(struct net *net)
{
fib_proc_exit(net);
nl_fib_lookup_exit(net);
ip_fib_net_exit(net);
}

static void __net_exit fib_net_exit_batch(struct list_head *net_list)
{
struct net *net;

rtnl_lock();
list_for_each_entry(net, net_list, exit_list)
ip_fib_net_exit(net);

rtnl_unlock();
}

static struct pernet_operations fib_net_ops = {
.init = fib_net_init,
.exit = fib_net_exit,
.exit_batch = fib_net_exit_batch,
};

void __init ip_fib_init(void)

0 comments on commit 1c69576

Please sign in to comment.