This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
realtime:documentation:technical_details:start [2023/09/21 17:58] costa.shul rt_mutexes, rt_mutex_adjust_prio_chain |
realtime:documentation:technical_details:start [2023/10/03 08:37] (current) costa.shul remove elixir |
||
---|---|---|---|
Line 4: | Line 4: | ||
Therefore different mechanisms are implemented. Those mechanisms are partially available in mainline Linux. | Therefore different mechanisms are implemented. Those mechanisms are partially available in mainline Linux. | ||
The PREEMPT_RT patch has been partially merged into the mainline Linux kernel, starting from version 5.15 ((Realtime preemption locking core merged [[https://lwn.net/Articles/867919/]])) | The PREEMPT_RT patch has been partially merged into the mainline Linux kernel, starting from version 5.15 ((Realtime preemption locking core merged [[https://lwn.net/Articles/867919/]])) | ||
- | and activated with paramether | + | and enabled with ''CONFIG_PREEMPT_RT'' |
- | [[https://elixir.bootlin.com/linux/latest/A/ident/CONFIG_PREEMPT_RT|CONFIG_PREEMPT_RT]] | + | |
---- | ---- | ||
Line 34: | Line 33: | ||
===== rt_mutex ===== | ===== rt_mutex ===== | ||
- | All mutexes in the mainline Linux kernel are replaced by [[https://elixir.bootlin.com/linux/latest/A/ident/rt_mutex|rt_mutexes]]. A rt_mutex implements [[https://elixir.bootlin.com/linux/latest/A/ident/rt_mutex_adjust_prio_chain|priority inheritance]] to avoid priority inversion. This also applies to sleeping spinlocks and rwlocks. However, the holder of a semaphore can be preempted but does not participate in priority inheritance. | + | [[https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/mutex.h|Mutexes]] are implemented with |
+ | [[https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/rtmutex.h|rt mutexes]]. A rt_mutex implements priority inheritance (see ''rt_mutex_adjust_prio_chain'') to avoid priority inversion. This also applies to sleeping spinlocks and rwlocks. However, the holder of a semaphore can be preempted but does not participate in priority inheritance. | ||
<WRAP rightalign>[[https://docs.kernel.org/locking/rt-mutex-design.html|Read more about rt_mutex]]</WRAP> | <WRAP rightalign>[[https://docs.kernel.org/locking/rt-mutex-design.html|Read more about rt_mutex]]</WRAP> | ||
Line 40: | Line 40: | ||
===== Sleeping spinlocks ===== | ===== Sleeping spinlocks ===== | ||
- | In a non-PREEMPT-RT preemption model spinlocks are mapped onto raw spinlocks. A task waiting for a spinlock held by another task spins until the task holding the spinlock releases it. Preemption is disabled in raw spinlock context. In PREEMPT_RT spinlocks are mapped onto sleeping spinlocks, and raw spinlocks retain their behavior. A task waiting for a sleeping spinlock goes to sleep and is woken up when the spinlock is released. In the sleeping spinlock context preemption is not disabled. | + | In a non-PREEMPT-RT preemption model [[https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/spinlock_types.h|spinlocks]] |
+ | are mapped onto | ||
+ | [[https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/spinlock_types_raw.h|raw spinlocks]]. | ||
+ | A task waiting for a spinlock held by another task spins until the task holding the spinlock releases it. Preemption is disabled in raw spinlock context. In PREEMPT_RT spinlocks are mapped onto [[https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/rtmutex.h|rt_mutex_base]] | ||
+ | and became "sleeping spinlocks", and raw spinlocks retain their behavior. A task waiting for a sleeping spinlock goes to sleep and is woken up when the spinlock is released. In the sleeping spinlock context preemption is not disabled. | ||
<WRAP rightalign>[[realtime:documentation:technical_details:sleeping_spinlocks|Read more about sleeping spinlocks]]</WRAP> | <WRAP rightalign>[[realtime:documentation:technical_details:sleeping_spinlocks|Read more about sleeping spinlocks]]</WRAP> | ||
Line 46: | Line 50: | ||
===== local_lock ===== | ===== local_lock ===== | ||
- | local_lock maps to a per CPU spinlock, which protects the critical section while staying preemptible. See [[https://elixir.bootlin.com/linux/latest/source/include/linux/local_lock_internal.h#L104|local_lock_internal.h]] | + | local_lock maps to a per CPU spinlock, which protects the critical section while staying preemptible. See [[https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/local_lock_internal.h#n104|local_lock_internal.h]] |
- | <WRAP rightalign>[[https://lwn.net/Articles/828477/|Read more about Local locks]]</WRAP> | + | <WRAP rightalign>[[https://docs.kernel.org/locking/locktypes.html#local-lock-and-preempt-rt|Read more about local_lock and PREEMPT_RT]]</WRAP> |
</WRAP> | </WRAP> | ||