What to do with rtems_semaphore_flush() on SMP?
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Mar 22 13:56:10 UTC 2016
Hello,
I am currently busy with eliminating the Giant lock for SMP. I came
across a problem with rtems_semaphore_flush() and _Thread_queue_Flush().
In general the rtems_semaphore_flush() is difficult to use correctly.
For example it could be used for condition synchronization, however, it
must be combined with the no-preempt mode otherwise is subject to the
lost wakeup problem. The no-preempt mode is not available on SMP
configurations. See also rtems_bdbuf_anonymous_wait()
https://git.rtems.org/rtems/tree/cpukit/libblock/src/bdbuf.c#n1080
What is a valid use case for rtems_semaphore_flush() on SMP configurations?
The rtems_semaphore_obtain/release() use fine grained locking via the
the thread queue lock of the object. rtems_semaphore_flush() in contrast
uses the Giant lock and disabled thread dispatching. It is possible to
generate livelock conditions in case a thread constantly calls
rtems_semaphore_obtain() and another thread constantly calls
rtems_semaphore_flush() (needs at least two processors).
One option would be to protect the complete _Thread_queue_Flush()
operation with the thread queue lock. This would result in a very big
critical section especially in case priority inheritance with OMIP
support (will be implemented later this year) is involved. There are
some difficult corner cases with thread deletion as well.
I am inclined to disable rtems_semaphore_flush() on SMP configurations,
e.g. if RTEMS_SMP and rtems_configuration_is_smp_enabled().
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list