diff mbox series

[net-next,v2] ipv6: try not to take rtnl_lock in ip6mr_sk_done

Message ID 20171108192347.0E52D40383@fruggeri-Arora18_1.sjc.aristanetworks.com
State Accepted, archived
Delegated to: David Miller
Headers show
Series [net-next,v2] ipv6: try not to take rtnl_lock in ip6mr_sk_done | expand

Commit Message

Francesco Ruggeri Nov. 8, 2017, 7:23 p.m. UTC
Avoid traversing the list of mr6_tables (which requires the
rtnl_lock) in ip6mr_sk_done(), when we know in advance that
a match will not be found.
This can happen when rawv6_close()/ip6mr_sk_done() is invoked
on non-mroute6 sockets.
This patch helps reduce rtnl_lock contention when destroying
a large number of net namespaces, each having a non-mroute6
raw socket.

v2: same patch, only fixed subject line and expanded comment.

Signed-off-by: Francesco Ruggeri <fruggeri@arista.com>

Comments

David Miller Nov. 13, 2017, 1:13 a.m. UTC | #1
From: fruggeri@arista.com (Francesco Ruggeri)
Date: Wed, 08 Nov 2017 11:23:46 -0800

> Avoid traversing the list of mr6_tables (which requires the
> rtnl_lock) in ip6mr_sk_done(), when we know in advance that
> a match will not be found.
> This can happen when rawv6_close()/ip6mr_sk_done() is invoked
> on non-mroute6 sockets.
> This patch helps reduce rtnl_lock contention when destroying
> a large number of net namespaces, each having a non-mroute6
> raw socket.
> 
> v2: same patch, only fixed subject line and expanded comment.
> 
> Signed-off-by: Francesco Ruggeri <fruggeri@arista.com>

Applied, thanks.
diff mbox series

Patch

diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index f5500f5..e1bb2d8 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -1617,6 +1617,10 @@  int ip6mr_sk_done(struct sock *sk)
 	struct net *net = sock_net(sk);
 	struct mr6_table *mrt;
 
+	if (sk->sk_type != SOCK_RAW ||
+	    inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
+		return err;
+
 	rtnl_lock();
 	ip6mr_for_each_table(mrt, net) {
 		if (sk == mrt->mroute6_sk) {