Messages in this thread | | | Date | Tue, 14 Mar 2006 09:02:25 +0530 | From | "Balbir Singh" <> | Subject | Re: [patch 1/3] radix tree: RCU lockless read-side |
| |
> The "slots" member is an array, not an RCU assigned pointer. As such, after > doing rcu_dereference(slot), you can access slot->slots[i] without further > memory barriers I think? > > But I agree that code now is a bit inconsistent. I've cleaned things up a > bit in my tree now... but perhaps it is easier if you send a patch to show > what you mean (because sometimes I'm a bit dense, I'm afraid). >
Fro starters, I do not think your dense at all.
Hmm... slot/slots is quite confusing name. I was referring to slot and ended up calling it slots. The point I am contending is that rcu_derefence(slot->slots[i]) should happen.
<snippet> + __s = rcu_dereference(slot->slots[i]); + if (__s != NULL) break; </snippet>
If we break from the loop because __s != NULL. Then in the snippet below
<snippet> /* Bottom level: grab some items */ for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE; i++) { index++; if (slot->slots[i]) { - results[nr_found++] = slot->slots[i]; + results[nr_found++] = &slot->slots[i]; if (nr_found == max_items) goto out; } </snippet>
We do not use __s above. "slot->slots[i]" is not rcu_derefenced() in this case because we broke out of the loop above with __s being not NULL. Another issue is - is it good enough to rcu_derefence() slot once? Shouldn't all uses of *slot->* be rcu derefenced?
<suggestion (WARNING: patch has spaces and its not compiled)> /* Bottom level: grab some items */ for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE; i++) { index++; - if (slot->slots[i]) { - results[nr_found++] = slot->slots[i]; + __s = rcu_dereference(slot->slots[i]); + if (__s) { + /* This is tricky, cannot take the address of __s or rcu_derefence() */ + results[nr_found++] = &slot->slots[i]; if (nr_found == max_items) goto out; } </suggestion>
I hope I am making sense.
Warm Regards, Balbir - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |