On Mon, Feb 19, 2018 at 05:29:46PM +0100, Christian KÃnig wrote:
[SNIP]Yeah it's the lock; trylock; lock combo that deadlocks. If lockdep indeed
Well that is not a problem at all. See we don't nest trylock with normal
lock acquiring, cause that would indeed bypass the whole deadlock detection.
Instead we first use ww_mutex_acquire to lock all BOs which are needed for a
command submission, including the deadlock detection.
Then all additional BOs which needed to be evicted to fulfill the current
request are trylocked.
catches that one (and not some other recursion combo) then I think we
don't have to worry about holding tons of trylock'ed locks.
Out of curiosity, why do you need to know that?If this is really what you want to do, then we need aActually considered that as well, but it turned out that this is exactly
ww_mutex_trylock_ctx, which also fills out the ctx value (so that other
threads can correctly resolve deadlocks when you hold that lock while
trying to grab additional locks). In which case you really don't need the
task pointer.
what I don't want.
Cause then we wouldn't be able to distinct ww_mutex locked with a context
(because they are part of the submission) and without (because TTM trylocked
them).
Hm, I thought it didn't detect a lock; trylock; lock combo because theYes it's a disappointment that lockdep doesn't correctly track trylocks,Sorry to disappoint you, but lockdep is indeed capable to correctly track
it just does basic sanity checks, but then drops them on the floor wrt
depency tracking. Just in case you wonder why you're not getting a
lockdeps splat for this. Unfortunately I don't understand lockdep enough
to be able to fix this gap.
those trylocked BOs.
Got quite a bunch of warning before I was able to resolve to this solution.
trylock didn't show up in the dependency stack. Maybe that got fixed
meanwhile.
Assuming that we indeed need both, could we split up the two use-cases for
clarity? I.e. ww_mutex_is_owned_by_ctx, which only takes the ctx (and
forgoes checking for a task, since that's implied) and requires a non-NULL
ctx. And ww_mutex_is_owned_by_task, which only takes the task (and maybe
we should limit it to trylock and _single locks, i.e. WARN_ON(lock->ctx)
if ww-mutex debugging is enabled).
Or does that hit another requirement of your use-case?
-Daniel