Forgot to mention the rtnl_lock hold time gain with these changes. I got the following benchmark results on one of our switches. Without this patch, deleting 1k interfaces with 100k routes in the fib held the rtnl_lock for 13 seconds. With the patch, rtnl_lock hold time went down to 5 seconds. The gain is even more pronounced with 512k routes in the FIB. In this case, without the patch, rtnl_lock was held for 36 seconds and with the patch it was held for 5.5 seconds.
On Thu, Feb 4, 2016 at 3:35 PM, Salam Noureddine <nouredd...@arista.com> wrote: > Added changes suggested by Julian Anastasov in version 2. > > fib_flush walks the whole fib in a net_namespace and is called for > each net_device being closed or unregistered. This can be very expensive > when dealing with 100k or more routes in the fib and removal of a lot > of interfaces. These four patches deal with this issue by calling fib_flush > just once for each net namespace and introduce a new function arp_ifdown_all > that does a similar optimization for the neighbour table. > > The benchmark tests were run on linux-3.18. > > Salam Noureddine (4): > net: add event_list to struct net and provide utility functions > net: dev: add batching to net_device notifiers > net: core: introduce neigh_ifdown_all for all down interfaces > net: fib: avoid calling fib_flush for each device when doing batch > close and unregister > > include/linux/netdevice.h | 2 ++ > include/net/arp.h | 1 + > include/net/neighbour.h | 1 + > include/net/net_namespace.h | 22 +++++++++++++++++++++ > include/net/netns/ipv4.h | 1 + > net/core/dev.c | 48 > ++++++++++++++++++++++++++++++++++++++++----- > net/core/neighbour.c | 38 ++++++++++++++++++++++++++++------- > net/core/net_namespace.c | 1 + > net/ipv4/arp.c | 4 ++++ > net/ipv4/fib_frontend.c | 16 +++++++++++++-- > 10 files changed, 120 insertions(+), 14 deletions(-) > > -- > 1.8.1.4 >