diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2024-06-05 21:13:15 +0300 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2024-07-17 17:28:11 +0300 |
commit | 6e30a7c98a9fda2f894e970e9cd637657f39c59d (patch) | |
tree | 70618796d6d3dfe48fe0b236febfb5e60d0e3982 | |
parent | 51835949dda3783d4639cfa74ce13a3c9829de00 (diff) | |
download | linux-6e30a7c98a9fda2f894e970e9cd637657f39c59d.tar.xz |
locking/atomic/x86: Introduce the read64_nonatomic macro to x86_32 with cx8
As described in commit:
e73c4e34a0e9 ("locking/atomic/x86: Introduce arch_atomic64_read_nonatomic() to x86_32")
the value preload before the CMPXCHG loop does not need to be atomic.
Introduce the read64_nonatomic assembly macro to load the value from a
atomic_t location in a faster non-atomic way and use it in
atomic64_cx8_32.S.
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20240605181424.3228-1-ubizjak@gmail.com
-rw-r--r-- | arch/x86/lib/atomic64_cx8_32.S | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/lib/atomic64_cx8_32.S b/arch/x86/lib/atomic64_cx8_32.S index 90afb488b396..b2eff07d65e4 100644 --- a/arch/x86/lib/atomic64_cx8_32.S +++ b/arch/x86/lib/atomic64_cx8_32.S @@ -16,6 +16,11 @@ cmpxchg8b (\reg) .endm +.macro read64_nonatomic reg + movl (\reg), %eax + movl 4(\reg), %edx +.endm + SYM_FUNC_START(atomic64_read_cx8) read64 %ecx RET @@ -51,7 +56,7 @@ SYM_FUNC_START(atomic64_\func\()_return_cx8) movl %edx, %edi movl %ecx, %ebp - read64 %ecx + read64_nonatomic %ecx 1: movl %eax, %ebx movl %edx, %ecx @@ -79,7 +84,7 @@ addsub_return sub sub sbb SYM_FUNC_START(atomic64_\func\()_return_cx8) pushl %ebx - read64 %esi + read64_nonatomic %esi 1: movl %eax, %ebx movl %edx, %ecx |