net: remove delay at device dismantle
authorEric Dumazet <edumazet@google.com>
Wed, 22 Aug 2012 17:19:46 +0000 (17:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Aug 2012 04:50:36 +0000 (21:50 -0700)
commit0115e8e30d6fcdd4b8faa30d3ffd90859a591f51
tree725026e2192e57b98366947ab53c73689ca040a8
parentbf277b0ccea7d2422b85e232017ce3fddbe9c49c
net: remove delay at device dismantle

I noticed extra one second delay in device dismantle, tracked down to
a call to dst_dev_event() while some call_rcu() are still in RCU queues.

These call_rcu() were posted by rt_free(struct rtable *rt) calls.

We then wait a little (but one second) in netdev_wait_allrefs() before
kicking again NETDEV_UNREGISTER.

As the call_rcu() are now completed, dst_dev_event() can do the needed
device swap on busy dst.

To solve this problem, add a new NETDEV_UNREGISTER_FINAL, called
after a rcu_barrier(), but outside of RTNL lock.

Use NETDEV_UNREGISTER_FINAL with care !

Change dst_dev_event() handler to react to NETDEV_UNREGISTER_FINAL

Also remove NETDEV_UNREGISTER_BATCH, as its not used anymore after
IP cache removal.

With help from Gao feng

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Tom Herbert <therbert@google.com>
Cc: Mahesh Bandewar <maheshb@google.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Gao feng <gaofeng@cn.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/core/dev.c
net/core/dst.c
net/core/fib_rules.c
net/core/rtnetlink.c
net/ipv4/devinet.c
net/ipv4/fib_frontend.c
net/ipv6/addrconf.c