mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 16:41:25 +00:00
locking: WW mutex cleanup
Make the WW mutex code more readable by adding comments, splitting up functions and pointing out that we're actually using the Wait-Die algorithm. Cc: Ingo Molnar <mingo@redhat.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Gustavo Padovan <gustavo@padovan.org> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Sean Paul <seanpaul@chromium.org> Cc: David Airlie <airlied@linux.ie> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> Cc: Josh Triplett <josh@joshtriplett.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Kate Stewart <kstewart@linuxfoundation.org> Cc: Philippe Ombredanne <pombredanne@nexb.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: linux-doc@vger.kernel.org Cc: linux-media@vger.kernel.org Cc: linaro-mm-sig@lists.linaro.org Co-authored-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Acked-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
eab9766931
commit
55f036ca7e
3 changed files with 150 additions and 102 deletions
|
@ -6,7 +6,7 @@
|
|||
*
|
||||
* Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
|
||||
*
|
||||
* Wound/wait implementation:
|
||||
* Wait/Die implementation:
|
||||
* Copyright (C) 2013 Canonical Ltd.
|
||||
*
|
||||
* This file contains the main data structure and API definitions.
|
||||
|
@ -28,9 +28,9 @@ struct ww_class {
|
|||
struct ww_acquire_ctx {
|
||||
struct task_struct *task;
|
||||
unsigned long stamp;
|
||||
unsigned acquired;
|
||||
unsigned int acquired;
|
||||
#ifdef CONFIG_DEBUG_MUTEXES
|
||||
unsigned done_acquire;
|
||||
unsigned int done_acquire;
|
||||
struct ww_class *ww_class;
|
||||
struct ww_mutex *contending_lock;
|
||||
#endif
|
||||
|
@ -38,8 +38,8 @@ struct ww_acquire_ctx {
|
|||
struct lockdep_map dep_map;
|
||||
#endif
|
||||
#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH
|
||||
unsigned deadlock_inject_interval;
|
||||
unsigned deadlock_inject_countdown;
|
||||
unsigned int deadlock_inject_interval;
|
||||
unsigned int deadlock_inject_countdown;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -102,7 +102,7 @@ static inline void ww_mutex_init(struct ww_mutex *lock,
|
|||
*
|
||||
* Context-based w/w mutex acquiring can be done in any order whatsoever within
|
||||
* a given lock class. Deadlocks will be detected and handled with the
|
||||
* wait/wound logic.
|
||||
* wait/die logic.
|
||||
*
|
||||
* Mixing of context-based w/w mutex acquiring and single w/w mutex locking can
|
||||
* result in undetected deadlocks and is so forbidden. Mixing different contexts
|
||||
|
@ -195,13 +195,13 @@ static inline void ww_acquire_fini(struct ww_acquire_ctx *ctx)
|
|||
* Lock the w/w mutex exclusively for this task.
|
||||
*
|
||||
* Deadlocks within a given w/w class of locks are detected and handled with the
|
||||
* wait/wound algorithm. If the lock isn't immediately avaiable this function
|
||||
* wait/die algorithm. If the lock isn't immediately available this function
|
||||
* will either sleep until it is (wait case). Or it selects the current context
|
||||
* for backing off by returning -EDEADLK (wound case). Trying to acquire the
|
||||
* for backing off by returning -EDEADLK (die case). Trying to acquire the
|
||||
* same lock with the same context twice is also detected and signalled by
|
||||
* returning -EALREADY. Returns 0 if the mutex was successfully acquired.
|
||||
*
|
||||
* In the wound case the caller must release all currently held w/w mutexes for
|
||||
* In the die case the caller must release all currently held w/w mutexes for
|
||||
* the given context and then wait for this contending lock to be available by
|
||||
* calling ww_mutex_lock_slow. Alternatively callers can opt to not acquire this
|
||||
* lock and proceed with trying to acquire further w/w mutexes (e.g. when
|
||||
|
@ -226,14 +226,14 @@ extern int /* __must_check */ ww_mutex_lock(struct ww_mutex *lock, struct ww_acq
|
|||
* Lock the w/w mutex exclusively for this task.
|
||||
*
|
||||
* Deadlocks within a given w/w class of locks are detected and handled with the
|
||||
* wait/wound algorithm. If the lock isn't immediately avaiable this function
|
||||
* wait/die algorithm. If the lock isn't immediately available this function
|
||||
* will either sleep until it is (wait case). Or it selects the current context
|
||||
* for backing off by returning -EDEADLK (wound case). Trying to acquire the
|
||||
* for backing off by returning -EDEADLK (die case). Trying to acquire the
|
||||
* same lock with the same context twice is also detected and signalled by
|
||||
* returning -EALREADY. Returns 0 if the mutex was successfully acquired. If a
|
||||
* signal arrives while waiting for the lock then this function returns -EINTR.
|
||||
*
|
||||
* In the wound case the caller must release all currently held w/w mutexes for
|
||||
* In the die case the caller must release all currently held w/w mutexes for
|
||||
* the given context and then wait for this contending lock to be available by
|
||||
* calling ww_mutex_lock_slow_interruptible. Alternatively callers can opt to
|
||||
* not acquire this lock and proceed with trying to acquire further w/w mutexes
|
||||
|
@ -256,7 +256,7 @@ extern int __must_check ww_mutex_lock_interruptible(struct ww_mutex *lock,
|
|||
* @lock: the mutex to be acquired
|
||||
* @ctx: w/w acquire context
|
||||
*
|
||||
* Acquires a w/w mutex with the given context after a wound case. This function
|
||||
* Acquires a w/w mutex with the given context after a die case. This function
|
||||
* will sleep until the lock becomes available.
|
||||
*
|
||||
* The caller must have released all w/w mutexes already acquired with the
|
||||
|
@ -290,7 +290,7 @@ ww_mutex_lock_slow(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
|
|||
* @lock: the mutex to be acquired
|
||||
* @ctx: w/w acquire context
|
||||
*
|
||||
* Acquires a w/w mutex with the given context after a wound case. This function
|
||||
* Acquires a w/w mutex with the given context after a die case. This function
|
||||
* will sleep until the lock becomes available and returns 0 when the lock has
|
||||
* been acquired. If a signal arrives while waiting for the lock then this
|
||||
* function returns -EINTR.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue