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/06 18:28] costa.shul move rt_mutex to the right |
realtime:documentation:technical_details:start [2023/10/03 08:37] (current) costa.shul remove elixir |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Technical details of PREEMPT_RT patch ====== | + | ====== Technical details of the real-time preemption ====== |
- | The main aim of the PREEMPT_RT patch is to //minimize the amount of kernel code that is non-preemptible// ((Paul McKenney, A realtime preemption overview [[https://lwn.net/Articles/146861/]])). Therefore different mechanisms are implemented. Those mechanisms are partially available in mainline Linux. | + | The main aim of the real-time preemption is to //minimize the amount of kernel code that is non-preemptible// ((Paul McKenney, A realtime preemption overview [[https://lwn.net/Articles/146861/]])). |
+ | 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/]])) | ||
+ | and enabled with ''CONFIG_PREEMPT_RT'' | ||
---- | ---- | ||
Line 8: | Line 11: | ||
===== High resolution timers ===== | ===== High resolution timers ===== | ||
- | The high resolution timers allows precise timed scheduling and removes the dependency of timers on the periodic scheduler tick (jiffies). The "high resolution timer design notes" explain the implementation details for high resolution timer, they are part of the kernel documentation. | + | The high resolution timers allows precise timed scheduling and removes the dependency of timers on the periodic scheduler tick (jiffies). |
- | + | ||
- | Since 2.6.24-rc1 the high resolution timer patches are fully merged and so the project is in "history mode". | + | |
- | Historically the high resolution timer patch was also integrated in the realtime preemption patch. | + | |
<WRAP rightalign>[[realtime:documentation:technical_details:hr_timers|Read more about High Resolution Timers]]</WRAP> | <WRAP rightalign>[[realtime:documentation:technical_details:hr_timers|Read more about High Resolution Timers]]</WRAP> | ||
Line 33: | Line 33: | ||
===== rt_mutex ===== | ===== rt_mutex ===== | ||
- | All mutexes in the mainline Linux kernel are replaced by rt_mutexes. A rt_mutex implements 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 39: | 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 45: | 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> | ||