Re: [RFC][PATCH RT 0/3] RT: Fix trylock deadlock without msleep() hack
From: Ingo Molnar <mingo@kernel.org>
Date: 2015-09-14 09:50:15
Also in:
lkml
* Thomas Gleixner [off-list ref] wrote:
quoted
And if we are into getting reference counts, why not solve it at a higher level and get a reference count to 'x' to make sure it's safe to use? Then we could do: lock(y->lock); retry: x = y->x; if (!trylock(x->lock)) { get_ref(x->count) unlock(y->lock); lock(x->lock); lock(y->lock); put_ref(x->count); if (y->x != x) { /* Retry if 'x' got dropped meanwhile */ unlock(x->lock); goto retry; } } Or so.In the case of dcache::dentry_kill() we probably do not have to take refcounts and it might be actually counterproductive to do so. y->x, i.e. dentry->parent, cannot vanish under us, if I understand the life time rules correctly.
Ok, that's even better.
Aside of that, yes, I was thinking about a similar scheme for that. I need some more time to grok all the rules there :)
Ok, great! :-) I really don't think we need a new locking primitive - and with something like the above we could improve the code upstream as well and make it scale better in some scenarios, right? Thanks, Ingo