Commit 73165b88 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] fix i386 mutex fastpath on FRAME_POINTER && !DEBUG_MUTEXES

Call the mutex slowpath more conservatively - e.g.  FRAME_POINTERS can
change the calling convention, in which case a direct branch to the
slowpath becomes illegal.  Bug found by Hugh Dickins.
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 042c904c
......@@ -28,7 +28,13 @@ do { \
\
__asm__ __volatile__( \
LOCK " decl (%%eax) \n" \
" js "#fail_fn" \n" \
" js 2f \n" \
"1: \n" \
\
LOCK_SECTION_START("") \
"2: call "#fail_fn" \n" \
" jmp 1b \n" \
LOCK_SECTION_END \
\
:"=a" (dummy) \
: "a" (count) \
......@@ -78,7 +84,13 @@ do { \
\
__asm__ __volatile__( \
LOCK " incl (%%eax) \n" \
" jle "#fail_fn" \n" \
" jle 2f \n" \
"1: \n" \
\
LOCK_SECTION_START("") \
"2: call "#fail_fn" \n" \
" jmp 1b \n" \
LOCK_SECTION_END \
\
:"=a" (dummy) \
: "a" (count) \
......
......@@ -84,12 +84,6 @@ void fastcall __sched mutex_lock(struct mutex *lock)
/*
* The locking fastpath is the 1->0 transition from
* 'unlocked' into 'locked' state.
*
* NOTE: if asm/mutex.h is included, then some architectures
* rely on mutex_lock() having _no other code_ here but this
* fastpath. That allows the assembly fastpath to do
* tail-merging optimizations. (If you want to put testcode
* here, do it under #ifndef CONFIG_MUTEX_DEBUG.)
*/
__mutex_fastpath_lock(&lock->count, __mutex_lock_slowpath);
}
......@@ -115,8 +109,6 @@ void fastcall __sched mutex_unlock(struct mutex *lock)
/*
* The unlocking fastpath is the 0->1 transition from 'locked'
* into 'unlocked' state:
*
* NOTE: no other code must be here - see mutex_lock() .
*/
__mutex_fastpath_unlock(&lock->count, __mutex_unlock_slowpath);
}
......@@ -261,7 +253,6 @@ __mutex_lock_interruptible_slowpath(atomic_t *lock_count __IP_DECL__);
*/
int fastcall __sched mutex_lock_interruptible(struct mutex *lock)
{
/* NOTE: no other code must be here - see mutex_lock() */
return __mutex_fastpath_lock_retval
(&lock->count, __mutex_lock_interruptible_slowpath);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment