The Case for Migratory Priority Inheritance in Linux: Bounded Priority Inversions on Multiprocessors

Björn B. Brandenburg, Andrea Bastoni · 2012

Linux’s real-time performance crucially depends on priority inheritance because—on uniprocessors—it limits the maximum duration of priority inversion to one critical section per lock while ensuring that tasks remain fully preemptable even when holding locks. Unfortunately, priority inheritance is ineffective on multiprocessors under non-global scheduling (i.e., if some tasks may not execute on every processor) in the sense that it does not prevent unbounded priority inversion in all cases. In fact, as shown in the paper, in a multiprocessor system with priority inheritance, it is possible for a task to suffer from priority inversion as long as in a uniprocessor system without priority inheritance. There is thus currently no predictable locking mechanism suitable for non-global scheduling available in Linux, short of resorting to non-preemptive sections or other latency-increasing mechanisms such as priority boosting. As multicore platforms are becoming more widespread in the embedded domain, this “predictability gap ” on multiprocessors limits Linux’s viability as a real-time platform. In this position paper, it is argued that a simple tweak to the priority inheritance algorithm will restore its efficacy on multiprocessors, without breaking POSIX compliance, increasing scheduling latency, or requiring large changes to Linux’s scheduling and locking code. In a nutshell, under the proposed migratory priority inheritance mechanism, inheritance is applied not only to scheduling priorities, but also to processor affinity masks. The need for migratory priority inheritance and its benefits are explained in detail with a sequence of simple examples. Additionally, a prototype implementation within the Linux kernel is described and potential challenges and simplifications are discussed. 1

Read the paper · More papers on PaperTik