Eric Dumazet wrote:Thanks for this clarification. I guess we really need a rcu head then :)Or just add SLAB_DESTROY_BY_RCU to slab creation in proto_register()Be careful!, SLAB_DESTROY_BY_RCU just means the slab page gets
for "struct proto udp_prot/udpv6_prot" so that kmem_cache_free() done
in sk_prot_free() can defer freeing to RCU...
RCU-freed, this means that slab object pointers stay pointing to valid
memory, but it does _NOT_ mean those slab objects themselves remain
valid.
The slab allocator is free to re-use those objects at any time -
irrespective of the rcu-grace period. Therefore you will have to be able
to validate that the object you point to is indeed the object you
expect, otherwise strange and wonderful things will happen.
No you just need to make sure that the object you located is still active
(f.e. refcount > 0) and that it is really a match (hash pointers may be
updated asynchronously and therefore point to the object that has been reused
for something else).
Generally it is advisable to use SLAB_DESTROY_BY_RCU because it preserves the
cache hot advantages of the objects. Regular RCU freeing will let the object
expire for a tick or so which will result in the cacheline cooling down.