Fine grain select locking.
Attilio Rao
attilio at FreeBSD.org
Fri Aug 3 07:31:29 UTC 2007
Jeff Roberson wrote:
>
> On Thu, 2 Aug 2007, Alfred Perlstein wrote:
>
>> * Jeff Roberson <jroberson at chesapeake.net> [070802 17:52] wrote:
>>>
>>> I believe filedescriptor locking is the place where we are most lacking.
>>> The new sx helped tremendously. However, this is still going to be a
>>> scalability limiter. I have looked into both linux and solaris's
>>> solution
>>> to this problem. Briefly, linux uses RCU to protect the list, which is
>>> close to ideal as this is certainly a read heavy workload. Solaris
>>> on the
>>> other hand uses the actual file lock to protect the descriptor slot. So
>>> they fetch the file pointer, lock it, and then check to see if they
>>> lost a
>>> race with the slot being reassigned while they were acquiring the lock.
>>> This approach is perhaps better than rcu in many cases except when the
>>> descriptor set is expanded. Then they have to lock every file in the
>>> set.
>>
>> Certainly this is an extreme edge case... ?
>
> Well that may be true, yes. However, there are other problems with this
> scheme. For example, flags settings could be done entirely with cmpset,
> without using a lock at all. In most cases we're just setting a bit
> which can be done with atomic_set. When we're doing multiple operations
> we could compute the value and attempt to est it in a loop. So we can
> totally eliminate locking the descriptor here.
>
> We also could use atomic ops to protect the file descriptor reference
> count. This would eliminate another use of the FILE_LOCK(). I'm not
> sure if it's possible to merge this with an approach that uses the
> FILE_LOCK() to protect the descriptor table. Although I've not thought
> it all the way through.
>
> If the ref count and flags were done with atomics the main consumer of
> FILE_LOCK would actually be the unix domain socket garbage collection
> code. How's that for old unix baggage. Do many programs actually pass
> around descriptors these days? inetd? others? It might be worth it to
> lock this seperately from the file lock.
I'm sure I've alredy implemented it, but later I realized that there is
a race with the p_fd field (if I got you right you are referring to the
fdesc_mtx here), so we probabilly should better arrange those paths firstly.
Thanks,
Attilio
More information about the freebsd-arch
mailing list