priority inheritance algorithms
Pavel Pisa
ppisa4lists at pikron.com
Wed Apr 24 21:28:49 UTC 2013
Hello all,
It worth to read documentation about RT mutex in the Linux kernel
http://lxr.linux.no/#linux+v3.8.8/Documentation/rt-mutex-design.txt
The core mechanism for sorting waiters for given mutex is "plist"
(priority based list). The other mechanism for priority inheritance/boost
is PI chain/list.
http://lxr.linux.no/#linux+v3.8.8/Documentation/rt-mutex-design.txt#L214
The sorting of the waiters based on "plist" is far from to be O(1),
use of RB-tree would be probably better for more waiters
linux-devel/include/linux/plist.h
* Based on simple lists (include/linux/list.h).
*
* This is a priority-sorted list of nodes; each node has a
* priority from INT_MIN (highest) to INT_MAX (lowest).
*
* Addition is O(K), removal is O(1), change of priority of a node is
* O(K) and K is the number of RT priority levels used in the system.
* (1 <= K <= 99)
*
* This list is really a list of lists:
*
* - The tier 1 list is the prio_list, different priority nodes.
*
* - The tier 2 list is the node_list, serialized nodes.
I have done some testing of RTEMS and Linux PI implementations.
You can find my test code cor RTEMS classic API
and POSIX RTEMS and Linux in the repo
git clone git://rtime.felk.cvut.cz/rtems-devel.git
rtems-devel/rtems-tests/prioinh_check
RTEMS classic
rtems-devel/rtems-tests/prioinh_posix
POSIX version
To build for RTEMS, you need to specify platform. I.e.:
cd rtems-devel/rtems-tests
echo RTEMS_MAKEFILE_PATH=/opt/rtems4.11/i386-rtems4.11/pc686 >config.target
To build for Linux, OMK Makefile.rules for Linux build can be used
(See http://rtime.felk.cvut.cz/omk/) or simple
gcc -lpthread -lrt prio_inherit_test.c
The output should look like this. Important part is to check
that task "THI" obtains semaphore "SHI" immediately after
Task "1" releases "SHI". That is order of the next two lines.
1 going to release SHI
THI obtained SHI
The problem can be hidden on SMP system but on UP system it requires
that task 1 priority is lowered imediattly after it releases SHI.
The test on the SMP Linux system can use affinity to bind whole test
on one CPU.
schedtool -a 1 -e ./prio_inherit_test
Then sequence should look like this
*** Starting up Task_1 ***
THI created
TMID created
LO created
1 obtained SLO
1 going to release RLO
1 obtained SHI
1 going to release RHI
THI released (RHI)
TLO released (RLO)
1 going to release RMID
1 going to release SHI
THI obtained SHI
THI going to release SHI
THI released SHI
MID released (RMID)
MID going to sleep
1 going to release SLO
1 released both SHI and SLO
1 going to sleep
TLO obtained SLO
TLO going to release SLO
TLO released SLO
1 obtained SLO
1 going to release RLO
1 obtained SHI
1 going to release RHI
THI released (RHI)
TLO released (RLO)
1 going to release RMID
1 going to release SHI
THI obtained SHI
THI going to release SHI
THI released SHI
MID released (RMID)
MID going to sleep
1 going to release SLO
1 released both SHI and SLO
1 going to sleep
TLO obtained SLO
TLO going to release SLO
TLO released SLO
Order can varry on SMP system and possible priority adjustment
problem can be hidden bu starting of THI on the different CPU.
*** Starting up Task_1 ***
THI created
TMID created
LO created
1 obtained SLO
1 going to release RLO
1 obtained SHI
1 going to release RHI
TLO released (RLO)
THI released (RHI)
1 going to release RMID
MID released (RMID)
1 going to release SHI
THI obtained SHI
MID going to sleep
1 going to release SLO
1 released both SHI and SLO
TLO obtained SLO
THI going to release SHI
THI released SHI
1 going to sleep
TLO going to release SLO
TLO released SLO
...
1 obtained SLO
1 going to release RLO
1 obtained SHI
1 going to release RHI
THI released (RHI)
TLO released (RLO)
1 going to release RMID
MID released (RMID)
1 going to release SHI
THI obtained SHI
MID going to sleep
1 going to release SLO
1 released both SHI and SLO
TLO obtained SLO
THI going to release SHI
THI released SHI
1 going to sleep
TLO going to release SLO
TLO released SLO
Best wishes,
Pavel
More information about the devel
mailing list