diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-20 07:31:17 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-06-26 06:10:56 -0400 |
commit | 230100276955529d5a7c69207421756b9a61a8e5 (patch) | |
tree | e9cb48f8e43bd7e3d3cf38ee1f1e2838de112913 /lib | |
parent | 040a0a37100563754bb1fee6ff6427420bcfa609 (diff) |
mutex: Add w/w mutex slowpath debugging
Injects EDEADLK conditions at pseudo-random interval, with
exponential backoff up to UINT_MAX (to ensure that every lock
operation still completes in a reasonable time).
This way we can test the wound slowpath even for ww mutex users
where contention is never expected, and the ww deadlock
avoidance algorithm is only needed for correctness against
malicious userspace. An example would be protecting kernel
modesetting properties, which thanks to single-threaded X isn't
really expected to contend, ever.
I've looked into using the CONFIG_FAULT_INJECTION
infrastructure, but decided against it for two reasons:
- EDEADLK handling is mandatory for ww mutex users and should
never affect the outcome of a syscall. This is in contrast to -ENOMEM
injection. So fine configurability isn't required.
- The fault injection framework only allows to set a simple
probability for failure. Now the probability that a ww mutex acquire
stage with N locks will never complete (due to too many injected
EDEADLK backoffs) is zero. But the expected number of ww_mutex_lock
operations for the completely uncontended case would be O(exp(N)).
The per-acuiqire ctx exponential backoff solution choosen here only
results in O(log N) overhead due to injection and so O(log N * N)
lock operations. This way we can fail with high probability (and so
have good test coverage even for fancy backoff and lock acquisition
paths) without running into patalogical cases.
Note that EDEADLK will only ever be injected when we managed to
acquire the lock. This prevents any behaviour changes for users
which rely on the EALREADY semantics.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: dri-devel@lists.freedesktop.org
Cc: linaro-mm-sig@lists.linaro.org
Cc: rostedt@goodmis.org
Cc: daniel@ffwll.ch
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20130620113117.4001.21681.stgit@patser
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig.debug | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 566cf2bc08ea..7154f799541a 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -547,6 +547,19 @@ config DEBUG_MUTEXES | |||
547 | This feature allows mutex semantics violations to be detected and | 547 | This feature allows mutex semantics violations to be detected and |
548 | reported. | 548 | reported. |
549 | 549 | ||
550 | config DEBUG_WW_MUTEX_SLOWPATH | ||
551 | bool "Wait/wound mutex debugging: Slowpath testing" | ||
552 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT | ||
553 | select DEBUG_LOCK_ALLOC | ||
554 | select DEBUG_SPINLOCK | ||
555 | select DEBUG_MUTEXES | ||
556 | help | ||
557 | This feature enables slowpath testing for w/w mutex users by | ||
558 | injecting additional -EDEADLK wound/backoff cases. Together with | ||
559 | the full mutex checks enabled with (CONFIG_PROVE_LOCKING) this | ||
560 | will test all possible w/w mutex interface abuse with the | ||
561 | exception of simply not acquiring all the required locks. | ||
562 | |||
550 | config DEBUG_LOCK_ALLOC | 563 | config DEBUG_LOCK_ALLOC |
551 | bool "Lock debugging: detect incorrect freeing of live locks" | 564 | bool "Lock debugging: detect incorrect freeing of live locks" |
552 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT | 565 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT |