rwlocks, correctness over speed.

Julian Elischer julian at elischer.org
Fri Nov 23 08:34:35 PST 2007


Julian Elischer wrote:
> Alfred Perlstein wrote:
>> * Max Laier <max at love2party.net> [071122 14:40] wrote:
>>> On Thursday 22 November 2007, Attilio Rao wrote:
>>>> 2007/11/22, Max Laier <max at love2party.net>:
>>>>> rwlocks are already used in places that do recursive reads.  The one
>>>>> place I'm certain about is pfil(9) and we need a proper sollution for
>>>>> this. Before rwlocks were used, I had a handrolled locking that
>>>>> supported both read/write semantics and starvation avoidance - at the
>>>>> cost of failing to allow futher read access when a writer asked for
>>>>> access.  This however, was quite application specific and not the
>>>>> most efficient implementation either.
>>>> I'm not a pfil(9) expert, but for what I've heard, rmlocks should be
>>>> really good for it, shouldn't them?
>>>>
>>>> The concept is that if we want to maintain fast paths for rwlock we
>>>> cannot do too much tricks there. And you can really deadlock if you
>>>> allow recursion on readers...
>>> How about adding rwlock_try_rlock() which would do the following:
>>>  1) Only variant to allow[1] read recursion and ...
>>>  2) ... only if no outstanding write requests
>>>  3) Let the caller deal with failure
>>>
>>> This can be implemented statically, so no overhead in the fast path.  
>>> The caller is in the best position to decide if it is recursing or 
>>> not - could keep that info on the stack - and can either fail[2] or 
>>> do a normal rwlock_rlock() which would wait for the writer to enter 
>>> and exit.
>>>
>>> [2] In most situation where you use read locks you can fail or roll 
>>> back carefully as you didn't change anything - obviously.  In pfil - 
>>> for instance - we just dropped the packet if there was a writer waiting.
>>>
>>> [1] "allow" in terms of WITNESS - if that can be done.
>>
>> The problem is that there is no tracking in the common case (without
>> additional overhead), so you can't know if you're recursing, unless
>> you track it yourself.
> 
> recursion is hard for the caller to know because unrelated code could 
> have done the original calls.
> The only way it can know is if there is some generic recursion detection.

translation: make recursion as hard as possible, (or disallow)

> 
>>
>> -Alfred
>>
>> _______________________________________________
>> freebsd-arch at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> To unsubscribe, send any mail to "freebsd-arch-unsubscribe at freebsd.org"
> 
> _______________________________________________
> freebsd-arch at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
> To unsubscribe, send any mail to "freebsd-arch-unsubscribe at freebsd.org"



More information about the freebsd-arch mailing list