Some problems with the libbsd update
sebastian.huber at embedded-brains.de
Wed Aug 22 07:50:57 UTC 2018
I work currently on an update of the libbsd to the latest FreeBSD head
(see also https://devel.rtems.org/ticket/3472). I was a quite smooth
process until May 2018. FreeBSD seems to receive a significant amount of
funding to perform better on NUMA systems. They started to use lock-free
data structures in the kernel and included the Concurrency Kit in the
The weak point of lock-free data structures is the memory reclamation.
FreeBSD introduced an epoch memory reclamation API:
It is now used for basic synchronization in the network stack and hard
to avoid. The Concurrency Kit and the epoch memory reclamation API are
interesting features for RTEMS as well. The FreeBSD implementation needs
a thread pinning feature which is hard to implement in RTEMS. It turned
out that this is only used as an optimization, see also:
To support everything in RTEMS is a lot of work, so I have to make some
trade-offs. The implementation of this API must be as efficient as
possible since it is used in the critical paths of the network stack. I
will try to use a single global epoch and thread-specific records as
suggested by Matthew Macy to avoid the need for per-processor data
structures and the thread pinning. One key issue is that epoch records
must not be destroyed:
The consequence of this is that unlimited thread objects may lead to
undefined behaviour with this implementation approach. Also thread-local
storage cannot be used since it is reinitialized once a thread restarted
or reused. The epoch record must be included in the Thread_Control and
must not be touched by _Thread_Initialize(). This means I have to move
the API and its implementation along with the Concurrency Kit to RTEMS.
Alternatively, I could try to implement the thread pinning feature. I am
not sure if it is possible at all. It will definitely not work well
together with mutex obtain timeouts.
Adding support for general purpose per-processor data structures would
be quite easy. We just have to collect all per-processor data in a
linker section and duplicate the section content for each secondary
processor. Then use the _Per_CPU_Information to get a pointer to the
corresponding memory area.
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