kernel-ark/net/core
Eric Dumazet 404e0a8b6a net: ipv4: fix RCU races on dst refcounts
commit c6cffba4ff (ipv4: Fix input route performance regression.)
added various fatal races with dst refcounts.

crashes happen on tcp workloads if routes are added/deleted at the same
time.

The dst_free() calls from free_fib_info_rcu() are clearly racy.

We need instead regular dst refcounting (dst_release()) and make
sure dst_release() is aware of RCU grace periods :

Add DST_RCU_FREE flag so that dst_release() respects an RCU grace period
before dst destruction for cached dst

Introduce a new inet_sk_rx_dst_set() helper, using atomic_inc_not_zero()
to make sure we dont increase a zero refcount (On a dst currently
waiting an rcu grace period before destruction)

rt_cache_route() must take a reference on the new cached route, and
release it if was not able to install it.

With this patch, my machines survive various benchmarks.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-07-30 14:53:22 -07:00
..
datagram.c net: skb_free_datagram_locked() doesnt drop all packets 2012-06-27 15:40:57 -07:00
dev_addr_lists.c net: addr_list: add exclusive dev_uc_add and dev_mc_add 2012-04-15 13:06:04 -04:00
dev.c net: Make skb->skb_iif always track skb->dev 2012-07-23 16:36:27 -07:00
drop_monitor.c drop_monitor: dont sleep in atomic context 2012-06-04 11:42:01 -04:00
dst.c net: ipv4: fix RCU races on dst refcounts 2012-07-30 14:53:22 -07:00
ethtool.c ethtool: Make more commands available to unprivileged processes 2012-06-12 18:51:09 -07:00
fib_rules.c ipv4: Elide fib_validate_source() completely when possible. 2012-06-29 01:36:36 -07:00
filter.c net/core: fix kernel-doc warnings 2012-06-08 22:20:58 -07:00
flow_dissector.c ipv6: add ipv6_addr_hash() helper 2012-07-18 11:28:46 -07:00
flow.c
gen_estimator.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
gen_stats.c gen_stats: Stop using NLA_PUT*(). 2012-04-02 04:33:44 -04:00
iovec.c net: get rid of some pointless casts to sockaddr 2012-03-11 19:11:22 -07:00
link_watch.c
Makefile
neighbour.c neigh: Convert over to dst_neigh_lookup_skb(). 2012-07-05 01:12:00 -07:00
net_namespace.c net: Statically initialize init_net.dev_base_head 2012-07-18 13:32:27 -07:00
net-sysfs.c wireless: remove wext sysfs 2012-06-05 15:32:15 -04:00
net-sysfs.h
net-traces.c
netevent.c
netpoll.c netpoll: move np->dev and np->dev_name init into __netpoll_setup() 2012-07-17 09:02:36 -07:00
netprio_cgroup.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2012-07-24 13:34:56 -07:00
pktgen.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2012-05-20 21:53:04 -04:00
request_sock.c
rtnetlink.c ipv6: fix incorrect route 'expires' value passed to userspace 2012-07-29 23:18:31 -07:00
scm.c get rid of ->scm_work_list 2012-07-22 23:58:00 +04:00
secure_seq.c
skbuff.c skbuff: export skb_copy_ubufs 2012-07-22 12:39:33 -07:00
sock_diag.c net: make sock diag per-namespace 2012-07-16 22:31:34 -07:00
sock.c net: netprio_cgroup: rework update socket logic 2012-07-22 12:44:01 -07:00
stream.c
sysctl_net_core.c net: Delete all remaining instances of ctl_path 2012-04-20 21:22:30 -04:00
timestamping.c
user_dma.c
utils.c net: Fixed coding style issues relating to braces. 2012-04-12 16:35:48 -04:00