The main aim of the PREEMPT_RT patch is to minimize the amount of kernel code that is non-preemptible 1). Therefore different mechanisms are implemented. Those mechanisms are partially available in mainline Linux.
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.
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.
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.
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.
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.
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.