Thread (105 messages) 105 messages, 13 authors, 2008-11-24

Re: [PATCH 3/3] net: Convert TCP & DCCP hash tables to use RCU / hlist_nulls

From: Eric Dumazet <hidden>
Date: 2008-11-13 13:53:01

Peter Zijlstra a écrit :
On Thu, 2008-11-13 at 14:15 +0100, Eric Dumazet wrote:
quoted
+begin:
+       sk_nulls_for_each_rcu(sk, node, &head->chain) {
                if (INET_MATCH(sk, net, hash, acookie,
+                                       saddr, daddr, ports, dif)) {
+                       if (unlikely(!atomic_inc_not_zero(&sk->sk_refcnt)))
+                               goto begintw;
+                       if (unlikely(!INET_MATCH(sk, net, hash, acookie,
+                               saddr, daddr, ports, dif))) {
+                               sock_put(sk);
+                               goto begin;
+                       }
This is the validation step that verifies the race opened by using
SLAB_DESTROY_BY_RCU, right?
The atomic_inc_not_zero() is not related to SLAB_DESTROY_BY_RCU but
classic RCU lookup. A writer can delete the item right before we try to use it.

Next step is necessary in case the deleted item was re-allocated and inserted
in a hash chain (this one or another one, it doesnt matter). In this case,
previous atomic_inc_not_zero test will succeed. So we must check again the item
we selected (and refcounted) is the one we were searching.

So yes, this bit should be documented, since SLAB_DESTROY_BY_RCU is
not really used in linux kernel at this moment.

Does it make sense to add a little comment to these validation steps to
keep people on their toes and aware of the trickery?
Yes, you are right.

Thanks

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help