diff options
author | Jan Beulich <JBeulich@novell.com> | 2011-07-19 07:59:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-07-21 03:03:31 -0400 |
commit | 4625cd637919edfb562e0d62abf94f52e9321335 (patch) | |
tree | 88c4cf965722fb54731a6e8f632ec6ef6e83e194 /arch/x86/lib | |
parent | dd2897bf0f4d523238e87dabb23e9634ea9ba73d (diff) |
x86: Unify rwlock assembly implementation
Rather than having two functionally identical implementations
for 32- and 64-bit configurations, extend the existing assembly
abstractions enough to fold the two rwlock implementations into
a shared one.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/4E258DD7020000780004E3EA@nat28.tlf.novell.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/lib')
-rw-r--r-- | arch/x86/lib/Makefile | 6 | ||||
-rw-r--r-- | arch/x86/lib/rwlock.S | 44 | ||||
-rw-r--r-- | arch/x86/lib/rwlock_64.S | 38 | ||||
-rw-r--r-- | arch/x86/lib/semaphore_32.S | 44 |
4 files changed, 48 insertions, 84 deletions
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile index f2479f19ddde..d3ed1203cdd7 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile | |||
@@ -20,6 +20,7 @@ lib-y := delay.o | |||
20 | lib-y += thunk_$(BITS).o | 20 | lib-y += thunk_$(BITS).o |
21 | lib-y += usercopy_$(BITS).o getuser.o putuser.o | 21 | lib-y += usercopy_$(BITS).o getuser.o putuser.o |
22 | lib-y += memcpy_$(BITS).o | 22 | lib-y += memcpy_$(BITS).o |
23 | lib-$(CONFIG_SMP) += rwlock.o | ||
23 | lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o | 24 | lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o |
24 | 25 | ||
25 | obj-y += msr.o msr-reg.o msr-reg-export.o | 26 | obj-y += msr.o msr-reg.o msr-reg-export.o |
@@ -29,7 +30,8 @@ ifeq ($(CONFIG_X86_32),y) | |||
29 | lib-y += atomic64_cx8_32.o | 30 | lib-y += atomic64_cx8_32.o |
30 | lib-y += checksum_32.o | 31 | lib-y += checksum_32.o |
31 | lib-y += strstr_32.o | 32 | lib-y += strstr_32.o |
32 | lib-y += semaphore_32.o string_32.o | 33 | lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += semaphore_32.o |
34 | lib-y += string_32.o | ||
33 | lib-y += cmpxchg.o | 35 | lib-y += cmpxchg.o |
34 | ifneq ($(CONFIG_X86_CMPXCHG64),y) | 36 | ifneq ($(CONFIG_X86_CMPXCHG64),y) |
35 | lib-y += cmpxchg8b_emu.o atomic64_386_32.o | 37 | lib-y += cmpxchg8b_emu.o atomic64_386_32.o |
@@ -40,7 +42,7 @@ else | |||
40 | lib-y += csum-partial_64.o csum-copy_64.o csum-wrappers_64.o | 42 | lib-y += csum-partial_64.o csum-copy_64.o csum-wrappers_64.o |
41 | lib-y += thunk_64.o clear_page_64.o copy_page_64.o | 43 | lib-y += thunk_64.o clear_page_64.o copy_page_64.o |
42 | lib-y += memmove_64.o memset_64.o | 44 | lib-y += memmove_64.o memset_64.o |
43 | lib-y += copy_user_64.o rwlock_64.o copy_user_nocache_64.o | 45 | lib-y += copy_user_64.o copy_user_nocache_64.o |
44 | lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem_64.o | 46 | lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem_64.o |
45 | lib-y += cmpxchg16b_emu.o | 47 | lib-y += cmpxchg16b_emu.o |
46 | endif | 48 | endif |
diff --git a/arch/x86/lib/rwlock.S b/arch/x86/lib/rwlock.S new file mode 100644 index 000000000000..fca17829caa8 --- /dev/null +++ b/arch/x86/lib/rwlock.S | |||
@@ -0,0 +1,44 @@ | |||
1 | /* Slow paths of read/write spinlocks. */ | ||
2 | |||
3 | #include <linux/linkage.h> | ||
4 | #include <asm/alternative-asm.h> | ||
5 | #include <asm/frame.h> | ||
6 | #include <asm/rwlock.h> | ||
7 | |||
8 | #ifdef CONFIG_X86_32 | ||
9 | # define __lock_ptr eax | ||
10 | #else | ||
11 | # define __lock_ptr rdi | ||
12 | #endif | ||
13 | |||
14 | ENTRY(__write_lock_failed) | ||
15 | CFI_STARTPROC | ||
16 | FRAME | ||
17 | 0: LOCK_PREFIX | ||
18 | addl $RW_LOCK_BIAS, (%__lock_ptr) | ||
19 | 1: rep; nop | ||
20 | cmpl $RW_LOCK_BIAS, (%__lock_ptr) | ||
21 | jne 1b | ||
22 | LOCK_PREFIX | ||
23 | subl $RW_LOCK_BIAS, (%__lock_ptr) | ||
24 | jnz 0b | ||
25 | ENDFRAME | ||
26 | ret | ||
27 | CFI_ENDPROC | ||
28 | END(__write_lock_failed) | ||
29 | |||
30 | ENTRY(__read_lock_failed) | ||
31 | CFI_STARTPROC | ||
32 | FRAME | ||
33 | 0: LOCK_PREFIX | ||
34 | incl (%__lock_ptr) | ||
35 | 1: rep; nop | ||
36 | cmpl $1, (%__lock_ptr) | ||
37 | js 1b | ||
38 | LOCK_PREFIX | ||
39 | decl (%__lock_ptr) | ||
40 | js 0b | ||
41 | ENDFRAME | ||
42 | ret | ||
43 | CFI_ENDPROC | ||
44 | END(__read_lock_failed) | ||
diff --git a/arch/x86/lib/rwlock_64.S b/arch/x86/lib/rwlock_64.S deleted file mode 100644 index 05ea55f71405..000000000000 --- a/arch/x86/lib/rwlock_64.S +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | /* Slow paths of read/write spinlocks. */ | ||
2 | |||
3 | #include <linux/linkage.h> | ||
4 | #include <asm/rwlock.h> | ||
5 | #include <asm/alternative-asm.h> | ||
6 | #include <asm/dwarf2.h> | ||
7 | |||
8 | /* rdi: pointer to rwlock_t */ | ||
9 | ENTRY(__write_lock_failed) | ||
10 | CFI_STARTPROC | ||
11 | LOCK_PREFIX | ||
12 | addl $RW_LOCK_BIAS,(%rdi) | ||
13 | 1: rep | ||
14 | nop | ||
15 | cmpl $RW_LOCK_BIAS,(%rdi) | ||
16 | jne 1b | ||
17 | LOCK_PREFIX | ||
18 | subl $RW_LOCK_BIAS,(%rdi) | ||
19 | jnz __write_lock_failed | ||
20 | ret | ||
21 | CFI_ENDPROC | ||
22 | END(__write_lock_failed) | ||
23 | |||
24 | /* rdi: pointer to rwlock_t */ | ||
25 | ENTRY(__read_lock_failed) | ||
26 | CFI_STARTPROC | ||
27 | LOCK_PREFIX | ||
28 | incl (%rdi) | ||
29 | 1: rep | ||
30 | nop | ||
31 | cmpl $1,(%rdi) | ||
32 | js 1b | ||
33 | LOCK_PREFIX | ||
34 | decl (%rdi) | ||
35 | js __read_lock_failed | ||
36 | ret | ||
37 | CFI_ENDPROC | ||
38 | END(__read_lock_failed) | ||
diff --git a/arch/x86/lib/semaphore_32.S b/arch/x86/lib/semaphore_32.S index 06691daa4108..65b591d778b1 100644 --- a/arch/x86/lib/semaphore_32.S +++ b/arch/x86/lib/semaphore_32.S | |||
@@ -14,8 +14,6 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
17 | #include <asm/rwlock.h> | ||
18 | #include <asm/alternative-asm.h> | ||
19 | #include <asm/frame.h> | 17 | #include <asm/frame.h> |
20 | #include <asm/dwarf2.h> | 18 | #include <asm/dwarf2.h> |
21 | 19 | ||
@@ -31,46 +29,6 @@ | |||
31 | */ | 29 | */ |
32 | .section .sched.text, "ax" | 30 | .section .sched.text, "ax" |
33 | 31 | ||
34 | /* | ||
35 | * rw spinlock fallbacks | ||
36 | */ | ||
37 | #ifdef CONFIG_SMP | ||
38 | ENTRY(__write_lock_failed) | ||
39 | CFI_STARTPROC | ||
40 | FRAME | ||
41 | 2: LOCK_PREFIX | ||
42 | addl $ RW_LOCK_BIAS,(%eax) | ||
43 | 1: rep; nop | ||
44 | cmpl $ RW_LOCK_BIAS,(%eax) | ||
45 | jne 1b | ||
46 | LOCK_PREFIX | ||
47 | subl $ RW_LOCK_BIAS,(%eax) | ||
48 | jnz 2b | ||
49 | ENDFRAME | ||
50 | ret | ||
51 | CFI_ENDPROC | ||
52 | ENDPROC(__write_lock_failed) | ||
53 | |||
54 | ENTRY(__read_lock_failed) | ||
55 | CFI_STARTPROC | ||
56 | FRAME | ||
57 | 2: LOCK_PREFIX | ||
58 | incl (%eax) | ||
59 | 1: rep; nop | ||
60 | cmpl $1,(%eax) | ||
61 | js 1b | ||
62 | LOCK_PREFIX | ||
63 | decl (%eax) | ||
64 | js 2b | ||
65 | ENDFRAME | ||
66 | ret | ||
67 | CFI_ENDPROC | ||
68 | ENDPROC(__read_lock_failed) | ||
69 | |||
70 | #endif | ||
71 | |||
72 | #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM | ||
73 | |||
74 | /* Fix up special calling conventions */ | 32 | /* Fix up special calling conventions */ |
75 | ENTRY(call_rwsem_down_read_failed) | 33 | ENTRY(call_rwsem_down_read_failed) |
76 | CFI_STARTPROC | 34 | CFI_STARTPROC |
@@ -120,5 +78,3 @@ ENTRY(call_rwsem_downgrade_wake) | |||
120 | ret | 78 | ret |
121 | CFI_ENDPROC | 79 | CFI_ENDPROC |
122 | ENDPROC(call_rwsem_downgrade_wake) | 80 | ENDPROC(call_rwsem_downgrade_wake) |
123 | |||
124 | #endif | ||