ipv4: Restore old dst_free() behavior.
authorEric Dumazet <eric.dumazet@gmail.com>
Tue, 31 Jul 2012 01:08:23 +0000 (01:08 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 31 Jul 2012 21:41:38 +0000 (14:41 -0700)
commit54764bb647b2e847c512acf8d443df965da35000
tree3918f6f42679d0ebdcef230f28285f99d178be62
parent5a0d513b622ee41e117fc37e26e27e8ef42e8dae
ipv4: Restore old dst_free() behavior.

commit 404e0a8b6a55 (net: ipv4: fix RCU races on dst refcounts) tried
to solve a race but added a problem at device/fib dismantle time :

We really want to call dst_free() as soon as possible, even if sockets
still have dst in their cache.
dst_release() calls in free_fib_info_rcu() are not welcomed.

Root of the problem was that now we also cache output routes (in
nh_rth_output), we must use call_rcu() instead of call_rcu_bh() in
rt_free(), because output route lookups are done in process context.

Based on feedback and initial patch from David Miller (adding another
call_rcu_bh() call in fib, but it appears it was not the right fix)

I left the inet_sk_rx_dst_set() helper and added __rcu attributes
to nh_rth_output and nh_rth_input to better document what is going on in
this code.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dst.h
include/net/inet_sock.h
include/net/ip_fib.h
net/core/dst.c
net/decnet/dn_route.c
net/ipv4/fib_semantics.c
net/ipv4/route.c