riscv: cmpxchg: implement arch_cmpxchg64_{relaxed|acquire|release}
authorJisheng Zhang <jszhang@kernel.org>
Sat, 25 Nov 2023 08:21:44 +0000 (16:21 +0800)
committerJaehoon Chung <jh80.chung@samsung.com>
Wed, 13 Mar 2024 06:58:50 +0000 (15:58 +0900)
After selecting ARCH_USE_CMPXCHG_LOCKREF, one straight futher
optimization is implementing the arch_cmpxchg64_relaxed() because the
lockref code does not need the cmpxchg to have barrier semantics. At
the same time, implement arch_cmpxchg64_acquire and
arch_cmpxchg64_release as well.

However, on both TH1520 and JH7110 platforms, I didn't see obvious
performance improvement with Linus' test case [1]. IMHO, this may
be related with the fence and lr.d/sc.d hw implementations. In theory,
lr/sc without fence could give performance improvement over lr/sc plus
fence, so add the code here to leave performance improvement room on
newer HW platforms.

Link: http://marc.info/?l=linux-fsdevel&m=137782380714721&w=4
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
(cherry picked from commit 556f057aca339cae1f71e91b41650337eaee4d9e)
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
arch/riscv/include/asm/cmpxchg.h

index fe0d9a037f721cd56e828af7980d5ac82f9b5627..16848bdaf6cf4d3869f05525f08df16524f41c9e 100644 (file)
@@ -396,4 +396,22 @@ static inline ulong __xchg16_relaxed(ulong new, void *ptr)
        cmpxchg_relaxed((ptr), (o), (n));                               \
 })
 
+#define cmpxchg64_relaxed(ptr, o, n)                           \
+({                                                                     \
+       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                              \
+       cmpxchg_relaxed((ptr), (o), (n));                               \
+})
+
+#define cmpxchg64_acquire(ptr, o, n)                           \
+({                                                                     \
+       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                              \
+       cmpxchg_acquire((ptr), (o), (n));                               \
+})
+
+#define cmpxchg64_release(ptr, o, n)                           \
+({                                                                     \
+       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                              \
+       cmpxchg_release((ptr), (o), (n));                               \
+})
+
 #endif /* _ASM_RISCV_CMPXCHG_H */