Realtime thread priorities

David Xu davidxu at
Tue Dec 14 01:30:23 UTC 2010

John Baldwin wrote:
> On Sunday, December 12, 2010 3:06:20 pm Sergey Babkin wrote:
>> John Baldwin wrote:
>>> The current layout breaks up the global thread priority space (0 - 255) 
> into a
>>> couple of bands:
>>>   0 -  63 : interrupt threads
>>>  64 - 127 : kernel sleep priorities (PSOCK, etc.)
>>> 128 - 159 : real-time user threads (rtprio)
>>> 160 - 223 : time-sharing user threads
>>> 224 - 255 : idle threads (idprio and kernel idle procs)
>>> If we decide to change the behavior I see two possible fixes:
>>> 1) (easy) just move the real-time priority range above the kernel sleep
>>> priority range
>> Would not this cause a priority inversion when an RT process
>> enters the kernel mode?
> How so?  Note that timesharing threads are not "bumped" to a kernel sleep 
> priority when they enter the kernel either.  The kernel sleep priorities are 
> purely a way for certain sleep channels to cause a thread to be treated as 
> interactive and give it a priority boost to favor interactive threads.  
> Threads in the kernel do not automatically have higher priority than threads 
> not in the kernel.  Keep in mind that all stopped threads (threads not 
> executing) are always in the kernel when they stop.

I have requirement to make a thread running in kernel has more higher
priority over a thread running userland code, because our kernel
mutex is not sleepable which does not like Solaris did, I have to use
semaphore like code in kern_umtx.c to lock a chain, which allows me
to read and write user address space, this is how umtxq_busy() did,
but it does not prevent a userland thread from preempting a thread
which locked the chain, if a realtime thread preempts a thread
locked the chain, it may lock up whole processes using pthread.
I think our realtime scheduling is not very useful, it is too easy
to lock up system.

David Xu

More information about the freebsd-arch mailing list