aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-generic/mutex-xchg.h
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-27 07:15:30 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-27 07:15:30 -0700
commita7bdf7fa33127bf08eb0810698bca607a9462df4 (patch)
tree2f4be686e49710d10cc4f5ebc2d5f06ae030b9bd /include/asm-generic/mutex-xchg.h
parent7fda953ffed1b94aa68f80c6c3ab312328aedcb3 (diff)
parentfea7a08acb13524b47711625eebea40a0ede69a0 (diff)
downloadkernel_replicant_linux-a7bdf7fa33127bf08eb0810698bca607a9462df4.tar.gz
kernel_replicant_linux-a7bdf7fa33127bf08eb0810698bca607a9462df4.tar.bz2
kernel_replicant_linux-a7bdf7fa33127bf08eb0810698bca607a9462df4.zip
Merge v3.6-rc3 into usb-next
This picks up fixes that we need in this branch for testing. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/asm-generic/mutex-xchg.h')
-rw-r--r--include/asm-generic/mutex-xchg.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/include/asm-generic/mutex-xchg.h b/include/asm-generic/mutex-xchg.h
index 580a6d35c700..c04e0db8a2d6 100644
--- a/include/asm-generic/mutex-xchg.h
+++ b/include/asm-generic/mutex-xchg.h
@@ -26,7 +26,13 @@ static inline void
__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))
{
if (unlikely(atomic_xchg(count, 0) != 1))
- fail_fn(count);
+ /*
+ * We failed to acquire the lock, so mark it contended
+ * to ensure that any waiting tasks are woken up by the
+ * unlock slow path.
+ */
+ if (likely(atomic_xchg(count, -1) != 1))
+ fail_fn(count);
}
/**
@@ -43,7 +49,8 @@ static inline int
__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
{
if (unlikely(atomic_xchg(count, 0) != 1))
- return fail_fn(count);
+ if (likely(atomic_xchg(count, -1) != 1))
+ return fail_fn(count);
return 0;
}