Re: [ANNOUNCE] 3.2.9-rt17
From: Peter Zijlstra <peterz@infradead.org>
Date: 2012-03-08 21:20:36
Also in:
lkml
On Thu, 2012-03-08 at 16:08 -0500, Steven Rostedt wrote:
Hmm, perhaps we need a way to attach a priority to a lock. Maybe we just need a way to set a priority of a lock with.. "A task of priority X needs the lock, set the owner to at least X while it holds the lock", where it doesn't care about the high priority task, it just cares about the lock. That is, give locks a priority too (like priority ceiling). On doing spin_trylock_rt() (no need for deadlock detection) if it fails, gives a lock the priority of the task trying to take it. The lock will be given a temporary priority for the duration it is held. The owner of the lock will get that priority unless its already higher in priority. When the lock is released, both the owner and the lock lose the priority. Note, spin_trylock_rt() continues to run even on failure. Have cpu_chill() do a "sched_yield()" (the good kind, to put the current FIFO task behind another FIFO task of the same priority). Then the owner of the lock will get to run. The sched_yield in cpu_chill() would be needed if the owner of the lock is blocked on the lock the high priority task has. After the high priority task releases its lock, and calls cpu_chill(), the sched_yield() allows the owner of the lock to run if it happens to be blocked on the lock the high prio task held. As the cpu_chill() will be called after that lock is released.
Now put the thing on 2 cpus and both tasks can endlessly chase each other's tail, no? The yield will be useless there..