diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-02 19:09:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-02 19:09:13 -0400 |
commit | 0c46d68d1930c8a58d0f291328b9759da754e599 (patch) | |
tree | 5cc551f56a86e204d648488c036fc1092fcd22a0 /include/asm-generic | |
parent | 3e42dee676e8cf5adca817b1518b2e99d1c138ff (diff) | |
parent | 166989e366ffa66108b2f37b870e66b85b2185ad (diff) |
Merge branch 'core-mutexes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull WW mutex support from Ingo Molnar:
"This tree adds support for wound/wait style locks, which the graphics
guys would like to make use of in the TTM graphics subsystem.
Wound/wait mutexes are used when other multiple lock acquisitions of a
similar type can be done in an arbitrary order. The deadlock handling
used here is called wait/wound in the RDBMS literature: The older
tasks waits until it can acquire the contended lock. The younger
tasks needs to back off and drop all the locks it is currently
holding, ie the younger task is wounded.
See this LWN.net description of W/W mutexes:
https://lwn.net/Articles/548909/
The comments there outline specific usecases for this facility (which
have already been implemented for the DRM tree).
Also see Documentation/ww-mutex-design.txt for more details"
* 'core-mutexes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
locking-selftests: Handle unexpected failures more strictly
mutex: Add more w/w tests to test EDEADLK path handling
mutex: Add more tests to lib/locking-selftest.c
mutex: Add w/w tests to lib/locking-selftest.c
mutex: Add w/w mutex slowpath debugging
mutex: Add support for wound/wait style locks
arch: Make __mutex_fastpath_lock_retval return whether fastpath succeeded or not
Diffstat (limited to 'include/asm-generic')
-rw-r--r-- | include/asm-generic/mutex-dec.h | 10 | ||||
-rw-r--r-- | include/asm-generic/mutex-null.h | 2 | ||||
-rw-r--r-- | include/asm-generic/mutex-xchg.h | 10 |
3 files changed, 9 insertions, 13 deletions
diff --git a/include/asm-generic/mutex-dec.h b/include/asm-generic/mutex-dec.h index f104af7cf437..d4f9fb4e53df 100644 --- a/include/asm-generic/mutex-dec.h +++ b/include/asm-generic/mutex-dec.h | |||
@@ -28,17 +28,15 @@ __mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) | |||
28 | * __mutex_fastpath_lock_retval - try to take the lock by moving the count | 28 | * __mutex_fastpath_lock_retval - try to take the lock by moving the count |
29 | * from 1 to a 0 value | 29 | * from 1 to a 0 value |
30 | * @count: pointer of type atomic_t | 30 | * @count: pointer of type atomic_t |
31 | * @fail_fn: function to call if the original value was not 1 | ||
32 | * | 31 | * |
33 | * Change the count from 1 to a value lower than 1, and call <fail_fn> if | 32 | * Change the count from 1 to a value lower than 1. This function returns 0 |
34 | * it wasn't 1 originally. This function returns 0 if the fastpath succeeds, | 33 | * if the fastpath succeeds, or -1 otherwise. |
35 | * or anything the slow path function returns. | ||
36 | */ | 34 | */ |
37 | static inline int | 35 | static inline int |
38 | __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) | 36 | __mutex_fastpath_lock_retval(atomic_t *count) |
39 | { | 37 | { |
40 | if (unlikely(atomic_dec_return(count) < 0)) | 38 | if (unlikely(atomic_dec_return(count) < 0)) |
41 | return fail_fn(count); | 39 | return -1; |
42 | return 0; | 40 | return 0; |
43 | } | 41 | } |
44 | 42 | ||
diff --git a/include/asm-generic/mutex-null.h b/include/asm-generic/mutex-null.h index e1bbbc72b6a2..61069ed334e2 100644 --- a/include/asm-generic/mutex-null.h +++ b/include/asm-generic/mutex-null.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #define _ASM_GENERIC_MUTEX_NULL_H | 11 | #define _ASM_GENERIC_MUTEX_NULL_H |
12 | 12 | ||
13 | #define __mutex_fastpath_lock(count, fail_fn) fail_fn(count) | 13 | #define __mutex_fastpath_lock(count, fail_fn) fail_fn(count) |
14 | #define __mutex_fastpath_lock_retval(count, fail_fn) fail_fn(count) | 14 | #define __mutex_fastpath_lock_retval(count) (-1) |
15 | #define __mutex_fastpath_unlock(count, fail_fn) fail_fn(count) | 15 | #define __mutex_fastpath_unlock(count, fail_fn) fail_fn(count) |
16 | #define __mutex_fastpath_trylock(count, fail_fn) fail_fn(count) | 16 | #define __mutex_fastpath_trylock(count, fail_fn) fail_fn(count) |
17 | #define __mutex_slowpath_needs_to_unlock() 1 | 17 | #define __mutex_slowpath_needs_to_unlock() 1 |
diff --git a/include/asm-generic/mutex-xchg.h b/include/asm-generic/mutex-xchg.h index c04e0db8a2d6..f169ec064785 100644 --- a/include/asm-generic/mutex-xchg.h +++ b/include/asm-generic/mutex-xchg.h | |||
@@ -39,18 +39,16 @@ __mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) | |||
39 | * __mutex_fastpath_lock_retval - try to take the lock by moving the count | 39 | * __mutex_fastpath_lock_retval - try to take the lock by moving the count |
40 | * from 1 to a 0 value | 40 | * from 1 to a 0 value |
41 | * @count: pointer of type atomic_t | 41 | * @count: pointer of type atomic_t |
42 | * @fail_fn: function to call if the original value was not 1 | ||
43 | * | 42 | * |
44 | * Change the count from 1 to a value lower than 1, and call <fail_fn> if it | 43 | * Change the count from 1 to a value lower than 1. This function returns 0 |
45 | * wasn't 1 originally. This function returns 0 if the fastpath succeeds, | 44 | * if the fastpath succeeds, or -1 otherwise. |
46 | * or anything the slow path function returns | ||
47 | */ | 45 | */ |
48 | static inline int | 46 | static inline int |
49 | __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) | 47 | __mutex_fastpath_lock_retval(atomic_t *count) |
50 | { | 48 | { |
51 | if (unlikely(atomic_xchg(count, 0) != 1)) | 49 | if (unlikely(atomic_xchg(count, 0) != 1)) |
52 | if (likely(atomic_xchg(count, -1) != 1)) | 50 | if (likely(atomic_xchg(count, -1) != 1)) |
53 | return fail_fn(count); | 51 | return -1; |
54 | return 0; | 52 | return 0; |
55 | } | 53 | } |
56 | 54 | ||