[PATCH] i386: Remove lock section support in rwsem.h
authorAndi Kleen <ak@suse.de>
Tue, 26 Sep 2006 08:52:31 +0000 (10:52 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Tue, 26 Sep 2006 08:52:31 +0000 (10:52 +0200)
Lock sections don't work the new dwarf2 unwinder
This generates slightly smaller code. It adds one more taken
jump to the fast path.

Also move the trampolines into semaphore.S and add proper CFI
annotations.

Cc: jbeulich@novell.com
Signed-off-by: Andi Kleen <ak@suse.de>
arch/i386/lib/semaphore.S
include/asm-i386/rwsem.h

index e16ff16963901dcf53faf9877396312c12323a5f..01f80b5c45d2fde74444b1be34b39016e7310e8f 100644 (file)
@@ -152,3 +152,66 @@ ENTRY(__read_lock_failed)
        END(__read_lock_failed)
 
 #endif
+
+/* Fix up special calling conventions */
+ENTRY(call_rwsem_down_read_failed)
+       CFI_STARTPROC
+       push %ecx
+       CFI_ADJUST_CFA_OFFSET 4
+       CFI_REL_OFFSET ecx,0
+       push %edx
+       CFI_ADJUST_CFA_OFFSET 4
+       CFI_REL_OFFSET edx,0
+       call rwsem_down_read_failed
+       pop %edx
+       CFI_ADJUST_CFA_OFFSET -4
+       pop %ecx
+       CFI_ADJUST_CFA_OFFSET -4
+       ret
+       CFI_ENDPROC
+       END(call_rwsem_down_read_failed)
+
+ENTRY(call_rwsem_down_write_failed)
+       CFI_STARTPROC
+       push %ecx
+       CFI_ADJUST_CFA_OFFSET 4
+       CFI_REL_OFFSET ecx,0
+       calll rwsem_down_write_failed
+       pop %ecx
+       CFI_ADJUST_CFA_OFFSET -4
+       ret
+       CFI_ENDPROC
+       END(call_rwsem_down_write_failed)
+
+ENTRY(call_rwsem_wake)
+       CFI_STARTPROC
+       decw %dx    /* do nothing if still outstanding active readers */
+       jnz 1f
+       push %ecx
+       CFI_ADJUST_CFA_OFFSET 4
+       CFI_REL_OFFSET ecx,0
+       call rwsem_wake
+       pop %ecx
+       CFI_ADJUST_CFA_OFFSET -4
+1:     ret
+       CFI_ENDPROC
+       END(call_rwsem_wake)
+
+/* Fix up special calling conventions */
+ENTRY(call_rwsem_downgrade_wake)
+       CFI_STARTPROC
+       push %ecx
+       CFI_ADJUST_CFA_OFFSET 4
+       CFI_REL_OFFSET ecx,0
+       push %edx
+       CFI_ADJUST_CFA_OFFSET 4
+       CFI_REL_OFFSET edx,0
+       call rwsem_downgrade_wake
+       pop %edx
+       CFI_ADJUST_CFA_OFFSET -4
+       pop %ecx
+       CFI_ADJUST_CFA_OFFSET -4
+       ret
+       CFI_ENDPROC
+       END(call_rwsem_downgrade_wake)
+
index 43113f5608ebb930127ca4b1c16ac01cd991b2bb..bc598d6388e30ad44db8ae857402d7af4a2db3aa 100644 (file)
@@ -99,17 +99,9 @@ static inline void __down_read(struct rw_semaphore *sem)
        __asm__ __volatile__(
                "# beginning down_read\n\t"
 LOCK_PREFIX    "  incl      (%%eax)\n\t" /* adds 0x00000001, returns the old value */
-               "  js        2f\n\t" /* jump if we weren't granted the lock */
+               "  jns        1f\n"
+               "  call call_rwsem_down_read_failed\n"
                "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  pushl     %%ecx\n\t"
-               "  pushl     %%edx\n\t"
-               "  call      rwsem_down_read_failed\n\t"
-               "  popl      %%edx\n\t"
-               "  popl      %%ecx\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
                "# ending down_read\n\t"
                : "+m" (sem->count)
                : "a" (sem)
@@ -151,15 +143,9 @@ static inline void __down_write_nested(struct rw_semaphore *sem, int subclass)
                "# beginning down_write\n\t"
 LOCK_PREFIX    "  xadd      %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns the old value */
                "  testl     %%edx,%%edx\n\t" /* was the count 0 before? */
-               "  jnz       2f\n\t" /* jump if we weren't granted the lock */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  pushl     %%ecx\n\t"
-               "  call      rwsem_down_write_failed\n\t"
-               "  popl      %%ecx\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
+               "  jz        1f\n"
+               "  call call_rwsem_down_write_failed\n"
+               "1:\n"
                "# ending down_write"
                : "+m" (sem->count), "=d" (tmp)
                : "a" (sem), "1" (tmp)
@@ -193,17 +179,9 @@ static inline void __up_read(struct rw_semaphore *sem)
        __asm__ __volatile__(
                "# beginning __up_read\n\t"
 LOCK_PREFIX    "  xadd      %%edx,(%%eax)\n\t" /* subtracts 1, returns the old value */
-               "  js        2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  decw      %%dx\n\t" /* do nothing if still outstanding active readers */
-               "  jnz       1b\n\t"
-               "  pushl     %%ecx\n\t"
-               "  call      rwsem_wake\n\t"
-               "  popl      %%ecx\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
+               "  jns        1f\n\t"
+               "  call call_rwsem_wake\n"
+               "1:\n"
                "# ending __up_read\n"
                : "+m" (sem->count), "=d" (tmp)
                : "a" (sem), "1" (tmp)
@@ -219,17 +197,9 @@ static inline void __up_write(struct rw_semaphore *sem)
                "# beginning __up_write\n\t"
                "  movl      %2,%%edx\n\t"
 LOCK_PREFIX    "  xaddl     %%edx,(%%eax)\n\t" /* tries to transition 0xffff0001 -> 0x00000000 */
-               "  jnz       2f\n\t" /* jump if the lock is being waited upon */
+               "  jz       1f\n"
+               "  call call_rwsem_wake\n"
                "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  decw      %%dx\n\t" /* did the active count reduce to 0? */
-               "  jnz       1b\n\t" /* jump back if not */
-               "  pushl     %%ecx\n\t"
-               "  call      rwsem_wake\n\t"
-               "  popl      %%ecx\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
                "# ending __up_write\n"
                : "+m" (sem->count)
                : "a" (sem), "i" (-RWSEM_ACTIVE_WRITE_BIAS)
@@ -244,17 +214,9 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
        __asm__ __volatile__(
                "# beginning __downgrade_write\n\t"
 LOCK_PREFIX    "  addl      %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 0xYYYY0001 */
-               "  js        2f\n\t" /* jump if the lock is being waited upon */
+               "  jns       1f\n\t"
+               "  call call_rwsem_downgrade_wake\n"
                "1:\n\t"
-               LOCK_SECTION_START("")
-               "2:\n\t"
-               "  pushl     %%ecx\n\t"
-               "  pushl     %%edx\n\t"
-               "  call      rwsem_downgrade_wake\n\t"
-               "  popl      %%edx\n\t"
-               "  popl      %%ecx\n\t"
-               "  jmp       1b\n"
-               LOCK_SECTION_END
                "# ending __downgrade_write\n"
                : "+m" (sem->count)
                : "a" (sem), "i" (-RWSEM_WAITING_BIAS)