linux/Documentation/RCU
Eric Dumazet 941297f443 netfilter: nf_conntrack: nf_conntrack_alloc() fixes
When a slab cache uses SLAB_DESTROY_BY_RCU, we must be careful when allocating
objects, since slab allocator could give a freed object still used by lockless
readers.

In particular, nf_conntrack RCU lookups rely on ct->tuplehash[xxx].hnnode.next
being always valid (ie containing a valid 'nulls' value, or a valid pointer to next
object in hash chain.)

kmem_cache_zalloc() setups object with NULL values, but a NULL value is not valid
for ct->tuplehash[xxx].hnnode.next.

Fix is to call kmem_cache_alloc() and do the zeroing ourself.

As spotted by Patrick, we also need to make sure lookup keys are committed to
memory before setting refcount to 1, or a lockless reader could get a reference
on the old version of the object. Its key re-check could then pass the barrier.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Patrick McHardy <kaber@trash.net>
2009-07-16 14:03:40 +02:00
..
00-INDEX Merge branch 'docs-next' of git://git.lwn.net/linux-2.6 2009-01-08 15:52:13 -08:00
arrayRCU.txt
checklist.txt rcu: documentation 1Q09 update 2009-03-10 15:55:11 -07:00
listRCU.txt Doc: Fix wrong API example usage of call_rcu(). 2009-04-02 01:33:50 -07:00
NMI-RCU.txt sched: 1Q08 RCU doc update, add call_rcu_sched() 2008-05-19 10:01:37 +02:00
rcu.txt Doc: Fix missing whitespaces in RCU documentation. 2009-04-02 01:33:50 -07:00
rcubarrier.txt Document RCU and unloadable modules 2008-12-03 15:58:01 -07:00
rculist_nulls.txt netfilter: nf_conntrack: nf_conntrack_alloc() fixes 2009-07-16 14:03:40 +02:00
rcuref.txt doc/RCU: fix pseudocode in rcuref.txt 2008-09-10 08:36:07 +02:00
RTFP.txt sched: 1Q08 RCU doc update, add call_rcu_sched() 2008-05-19 10:01:37 +02:00
torture.txt rcu: make rcutorture even more vicious: invoke RCU readers from irq handlers (timers) 2008-06-26 09:24:33 +02:00
trace.txt rcu: Update RCU tracing documentation for __rcu_pending 2009-04-14 11:33:43 +02:00
UP.txt [PATCH] Yet another RCU documentation update 2005-09-10 10:06:24 -07:00
whatisRCU.txt rcu: remove list_for_each_rcu() 2008-08-15 17:03:06 +02:00