This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
realtime:technical_preempt_rt [2016/06/23 07:28] anna-maria created |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Technical details of PREEMPT_RT patch ====== | ||
- | 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. | ||
- | |||
- | ---- | ||
- | |||
- | <WRAP half column> | ||
- | ===== High resolution timers ===== | ||
- | |||
- | |||
- | <WRAP center round todo 60%> | ||
- | This section needs to be edited and filled with a small teaser. The detailed information should be outsourced into an own page. | ||
- | </WRAP> | ||
- | |||
- | </WRAP> | ||
- | |||
- | <WRAP half column> | ||
- | ===== 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. | ||
- | |||
- | <WRAP rightalign>[[sleeping_spinlocks|Read more about sleeping spinlocks]]</WRAP> | ||
- | |||
- | </WRAP> | ||
- | |||
- | <WRAP half column> | ||
- | ===== Threaded interrupt handler ===== | ||
- | |||
- | The PREEMPT_RT patch forces the mechanism of threaded interrupt handlers. Due to this all interrupt handlers run in a threaded context except they are marked with the IRQF_NO_THREAD flag. This mechanism can be forced also in Linux mainline kernel without PREEMPT_RT patch by the kernel command line option ''threadirqs''. But there is a small difference in the resulted behavior. | ||
- | |||
- | <WRAP rightalign>[[threadirq|Read more about threaded interrupt handlers]]</WRAP> | ||
- | </WRAP> | ||
- | |||
- | <WRAP half column> | ||
- | ===== 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. | ||
- | |||
- | <WRAP rightalign>[[rt_mutex|Read more about rt_mutex]]</WRAP> | ||
- | </WRAP> | ||
- | |||
- | <WRAP half column> | ||
- | ===== RCU ===== | ||
- | |||
- | RCU mechanisms in mainline Linux are only preemptible if CONFIG_PREEMPT is set (Preemption model: "Low-Latency Desktop"). The PREEMPT_RT preemption models both use preemptible RCU mechanisms. Additionally the PREEMPT_RT patch eliminates RCU handling from all intermediate states and processes it only in its own thread. | ||
- | |||
- | <WRAP rightalign>[[rt_mutex|Read more about RCU]]</WRAP> | ||
- | |||
- | </WRAP> |