On Thu, 2012-03-08 at 19:28 +0100, Peter Zijlstra wrote: > On Thu, 2012-03-08 at 13:23 -0500, Steven Rostedt wrote: > > So basically what you tried to do was just set the owner of the lock to > > have the priority of the task that wants the lock, until it releases it? > > But by doing it without having this task sleep? > > No, by having it sleep ;-) > That was the second part of my email. > So you do the full PI sleeping lock thing, except you return fail if you > loose the acquisition race on wakeup and you mark this waiter as > 'special'. > > Then on every rt_mutex block you have to do a deadlock analysis on the > PI blocking chain (preferably shared with PI boost traversal of said > chain), during that scan you collect all special tagged waiters. > > If you find a deadlock, wake all these special waiters and have them > return -EDEADLK. > > I guess you could also do the full spin_deadlock() and do away with the > try part and purely rely on the deadlock detection. But do you release the lock first? For example, we have: @@ -410,7 +411,7 @@ static inline struct dentry *dentry_kill if (inode && !spin_trylock(&inode->i_lock)) { relock: seq_spin_unlock(&dentry->d_lock); - cpu_relax(); + cpu_chill(); return dentry; /* try again with same dentry */ } By doing the test at the trylock, we can easily hit the deadlock, because we still hold dentry->d_lock. But by moving the block to the cpu_chill(), then we are less likely to hit the deadlock. Perhaps call it, cpu_chill_on_lock(). -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html