Re: [RFC][PATCH RT 0/3] RT: Fix trylock deadlock without msleep() hack
From: Steven Rostedt <rostedt@goodmis.org>
Date: 2015-09-05 12:18:47
Also in:
lkml
From: Steven Rostedt <rostedt@goodmis.org>
Date: 2015-09-05 12:18:47
Also in:
lkml
On Sat, 5 Sep 2015 12:30:59 +0200 (CEST) Thomas Gleixner [off-list ref] wrote:
So the problem we need to solve is:
retry:
lock(B);
if (!try_lock(A)) {
unlock(B);
cpu_relax();
goto retry;
}
So instead of doing that proposed magic boost, we can do something
more straight forward:
retry:
lock(B);
if (!try_lock(A)) {
lock_and_drop(A, B);
unlock(A);
goto retry;
}
lock_and_drop() queues the task as a waiter on A, drops B and then
does the PI adjustment on A. That was my original solution, and I believe I added patches to do exactly that to the networking code in the past. I remember writing that helper function such that on non PREEMPT_RT it was a nop. I even had that solution in my slides at LinuxCon/LinuxPlumbers ;-) But then I talk about dcache.c. Take a look at that file, and the complexity of that. Is it safe to take the inode and dcache parent locks after you unlock the other locks? -- Steve