From: Andi Kleen <a...@linux.intel.com>

__read/write_lock_failed did execute a PAUSE first thing before
checking the lock. This aborts transactions. Check the lock
state again before executing the pause. This avoids a small
number of extra aborts, and is slightly cheaper too.

Signed-off-by: Andi Kleen <a...@linux.intel.com>
---
 arch/x86/lib/rwlock.S |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/x86/lib/rwlock.S b/arch/x86/lib/rwlock.S
index 1cad221..9a6bc12 100644
--- a/arch/x86/lib/rwlock.S
+++ b/arch/x86/lib/rwlock.S
@@ -16,10 +16,12 @@ ENTRY(__write_lock_failed)
        FRAME
 0:     LOCK_PREFIX
        WRITE_LOCK_ADD($RW_LOCK_BIAS) (%__lock_ptr)
+       cmpl    $WRITE_LOCK_CMP, (%__lock_ptr)
+       je      2f
 1:     rep; nop
        cmpl    $WRITE_LOCK_CMP, (%__lock_ptr)
        jne     1b
-       LOCK_PREFIX
+2:     LOCK_PREFIX
        WRITE_LOCK_SUB($RW_LOCK_BIAS) (%__lock_ptr)
        jnz     0b
        ENDFRAME
@@ -32,10 +34,12 @@ ENTRY(__read_lock_failed)
        FRAME
 0:     LOCK_PREFIX
        READ_LOCK_SIZE(inc) (%__lock_ptr)
+       READ_LOCK_SIZE(cmp) $1, (%__lock_ptr)
+       jns  2f
 1:     rep; nop
        READ_LOCK_SIZE(cmp) $1, (%__lock_ptr)
        js      1b
-       LOCK_PREFIX
+2:     LOCK_PREFIX
        READ_LOCK_SIZE(dec) (%__lock_ptr)
        js      0b
        ENDFRAME
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to