Getting rid of the static msleep priority boost

Jeff Roberson jroberson at chesapeake.net
Thu Mar 20 02:31:41 UTC 2008


On Wed, 19 Mar 2008, Daniel Eischen wrote:

> On Wed, 19 Mar 2008, John Baldwin wrote:
>
>> On Wednesday 19 March 2008 01:23:44 pm Alfred Perlstein wrote:
>>> * Jeff Roberson <jroberson at chesapeake.net> [080319 02:51] wrote:
>>>> On Wed, 19 Mar 2008, David Xu wrote:
>>>> 
>>>>> Daniel Eischen wrote:
>>>>> 
>>>>>> I'm not sure if any of the above remove the priority from the API,
>>>>>> but it would be nice to get rid of msleep totally and replace it
>>>>>> with an equivalent cv_wait().
>>>>>> 
>>>>> 
>>>>> And create sleep queue in each cv to get rid of shared sleep queue
>>>>> lock ?
>>>> 
>>>> Some spinlock is required to interlock with the scheduler lock via
>>>> thread_lock().  So I don't think you can get rid of that layer.  You also
>>>> wouldn't want to have the cost of a 'struct sleepqueue' everywhere you
>>>> want a msleep/condvar.
>>>> 
>>>> I personally don't see any real advantage to using condvar everywhere.
>>>> The only thing you really get is protection against spurious wakeups.
>>> 
>>> In theory can't you protect the waitq hung off of condvars with
>>> the mutex/spinlock used for the condvar instead of a global
>>> (hashed) lock on the global waitq?
>> 
>> Right now we let people invoke cv_wakeup/signal w/o holding the lock.  I
>> actually took the thread queue out of condvar's back when doing the 
>> original
>> sleep queue stuff since it is cheaper space wise.  Instead of each possible
>> condvar having its own set of queue pointers you just have a set of queue
>> pointers for each thread in the system.  Similar to only have a turnstile 
>> per
>> thread rather than per lock.
>
> In regards to why should we use cv_wait() instead of msleep()'s, the
> mutex/cv operations are more POSIX/pthreads-like with a simpler
> set of arguments.  Solaris for example does not have msleep() nor
> anything like that I can see, it uses similar mutex/cv operations
> as part of its kernel ABI (DDI/DKI).  I don't think there is a problem
> in allowing cv_signal() to be called without holding the lock, but
> it's nice that cv_wait() requires the lock - this is the same
> behavior as in pthreads and Solaris primitives.
>
> Perhaps there are no performance differences, but the cv/mutex
> primitives are a nice clean interface that most everyone
> understands.  If you are going to write a professional OS from
> the ground up, I doubt you are going to have anything as convoluted
> as msleep() as part of your kernel API/ABI.

One real obstacle to converting all locations to cv_* is the lack of 
support for anything other than mtx def mutexes in the cv api.  It also 
just doesn't seem like a good use of developer resources regardless of how 
you feel about msleep.

Also, in regards to interlocking with the user supplied lock; the lock 
that we interlock with for scheduling purposes must be a spinlock. 
Therefore we can't use just any user supplied lock to protect the sleepq 
chain.

Thanks,
Jeff

>
> -- 
> DE
>


More information about the freebsd-arch mailing list