Greets,

I have read a couple of earlier posts by Jeff and Mark Maybee explaining how 
Arc reference counting works. 
These posts did help clarifying this piece of code ( a bit complex, to say the 
least).
I would like to solicit more comments elucidating ARC reference counting.

The usage pattern I see in arc.c does not seem to be following a simple 
pattern, like the one we see in VFS.
The crux of the matter: who are the "users" that own these references?

Perhaps I am  misreading the code but this is how it looks to me:

arc_buf_hdr->b_count  keeps track of simultaneous readers of an arc_buf_hdr who 
called with a non-null callback parameter. The expected scenario is 
simultaneous access from 2 or more files (which are clones or snapshots).

The reason for the ref count and the buffer cloning: to maintain cache 
integrity 
when multiple readers access the same arc cache entry, and one of these 
modifies the entry and ultimately ends up releasing the arc entry from the 
cache.

At such time, one of the "users" needs an anonymous entry that can be dirtied 
and written out to a different spot, while the other needs an unchanged ARC 
entry.

This was probably expected to be a relatively rare occurrence, and it is not 
expected that a large number of simultaneous  readers would access the same ARC 
entry. 
I am a bit puzzled why a new ARC entry could not be cloned in arc_release, but 
perhaps there is a good reason why pre-allocating this data is better than the 
JIT alternative.

I notice that prefetch functions (dbuf_prefetch and traverse_prefetcher) call 
arc_read_nolock without a callback parameter, I wonder if this could create  a 
problem if a prefetch function, and a "regular" read simultaneously access the 
same ARC cache entry. (Cloning in this case would not happen, so one thread 
could end up releasing the entry from the cache while the other is messing with 
it).

Comments and corrections to my interpretation are cordially solicited.
-- 
This message posted from opensolaris.org

Reply via email to