net: Fix high overhead of vlan sub-device teardown.
authorDavid S. Miller <davem@davemloft.net>
Thu, 19 Mar 2015 02:52:33 +0000 (22:52 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Mar 2015 02:52:56 +0000 (22:52 -0400)
When a networking device is taken down that has a non-trivial number
of VLAN devices configured under it, we eat a full synchronize_net()
for every such VLAN device.

This is because of the call chain:

NETDEV_DOWN notifier
--> vlan_device_event()
--> dev_change_flags()
--> __dev_change_flags()
--> __dev_close()
--> __dev_close_many()
--> dev_deactivate_many()
--> synchronize_net()

This is kind of rediculous because we already have infrastructure for
batching doing operation X to a list of net devices so that we only
incur one sync.

So make use of that by exporting dev_close_many() and adjusting it's
interfaace so that the caller can fully manage the batch list.  Use
this in vlan_device_event() and all the overhead goes away.

Reported-by: Salam Noureddine <noureddine@arista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/8021q/vlan.c
net/core/dev.c

Simple merge
Simple merge
diff --cc net/core/dev.c
Simple merge