summaryrefslogtreecommitdiffstats
path: root/kernel/futex
diff options
context:
space:
mode:
authorGuo Ren <guoren@linux.alibaba.com>2023-09-08 11:43:39 -0400
committerIngo Molnar <mingo@kernel.org>2023-09-21 10:17:00 +0200
commitc6f4a90022524d06f6d9de323b1757031dcf0c26 (patch)
tree99086c83676e7efb478369ea9b240f395f2a442c /kernel/futex
parentfbeb558b0dd0d6348e0872bbbbe96e30c65867b7 (diff)
downloadlinux-c6f4a90022524d06f6d9de323b1757031dcf0c26.tar.gz
linux-c6f4a90022524d06f6d9de323b1757031dcf0c26.tar.bz2
linux-c6f4a90022524d06f6d9de323b1757031dcf0c26.zip
asm-generic: ticket-lock: Optimize arch_spin_value_unlocked()
The arch_spin_value_unlocked() of ticket-lock would cause the compiler to generate inefficient asm code in riscv architecture because of unnecessary memory access to the contended value. Before the patch: void lockref_get(struct lockref *lockref) { 78: fd010113 add sp,sp,-48 7c: 02813023 sd s0,32(sp) 80: 02113423 sd ra,40(sp) 84: 03010413 add s0,sp,48 0000000000000088 <.LBB296>: CMPXCHG_LOOP( 88: 00053783 ld a5,0(a0) After the patch: void lockref_get(struct lockref *lockref) { CMPXCHG_LOOP( 78: 00053783 ld a5,0(a0) After the patch, the lockref_get() could get in a fast path instead of the function's prologue. This is because ticket lock complex logic would limit compiler optimization for the spinlock fast path, and qspinlock won't. The caller of arch_spin_value_unlocked() could benefit from this change. Currently, the only caller is lockref. Signed-off-by: Guo Ren <guoren@kernel.org> Signed-off-by: Guo Ren <guoren@linux.alibaba.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Waiman Long <longman@redhat.com> Acked-by: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20230908154339.3250567-1-guoren@kernel.org
Diffstat (limited to 'kernel/futex')
0 files changed, 0 insertions, 0 deletions