Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools: Add riscv barrier implementation

Many of the other architectures use their custom barrier implementations.
Use the barrier code from the kernel sources to optimize barriers in
tools.

Signed-off-by: Charlie Jenkins <charlie@rivosinc.com>
Reviewed-by: Andrea Parri <parri.andrea@gmail.com>
Link: https://lore.kernel.org/r/20240806-optimize_ring_buffer_read_riscv-v2-1-ca7e193ae198@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>

authored by

Charlie Jenkins and committed by
Palmer Dabbelt
6d74d178 8400291e

+54
+39
tools/arch/riscv/include/asm/barrier.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copied from the kernel sources to tools/arch/riscv: 4 + * 5 + * Copyright (C) 2012 ARM Ltd. 6 + * Copyright (C) 2013 Regents of the University of California 7 + * Copyright (C) 2017 SiFive 8 + */ 9 + 10 + #ifndef _TOOLS_LINUX_ASM_RISCV_BARRIER_H 11 + #define _TOOLS_LINUX_ASM_RISCV_BARRIER_H 12 + 13 + #include <asm/fence.h> 14 + #include <linux/compiler.h> 15 + 16 + /* These barriers need to enforce ordering on both devices and memory. */ 17 + #define mb() RISCV_FENCE(iorw, iorw) 18 + #define rmb() RISCV_FENCE(ir, ir) 19 + #define wmb() RISCV_FENCE(ow, ow) 20 + 21 + /* These barriers do not need to enforce ordering on devices, just memory. */ 22 + #define smp_mb() RISCV_FENCE(rw, rw) 23 + #define smp_rmb() RISCV_FENCE(r, r) 24 + #define smp_wmb() RISCV_FENCE(w, w) 25 + 26 + #define smp_store_release(p, v) \ 27 + do { \ 28 + RISCV_FENCE(rw, w); \ 29 + WRITE_ONCE(*p, v); \ 30 + } while (0) 31 + 32 + #define smp_load_acquire(p) \ 33 + ({ \ 34 + typeof(*p) ___p1 = READ_ONCE(*p); \ 35 + RISCV_FENCE(r, rw); \ 36 + ___p1; \ 37 + }) 38 + 39 + #endif /* _TOOLS_LINUX_ASM_RISCV_BARRIER_H */
+13
tools/arch/riscv/include/asm/fence.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copied from the kernel sources to tools/arch/riscv: 4 + */ 5 + 6 + #ifndef _ASM_RISCV_FENCE_H 7 + #define _ASM_RISCV_FENCE_H 8 + 9 + #define RISCV_FENCE_ASM(p, s) "\tfence " #p "," #s "\n" 10 + #define RISCV_FENCE(p, s) \ 11 + ({ __asm__ __volatile__ (RISCV_FENCE_ASM(p, s) : : : "memory"); }) 12 + 13 + #endif /* _ASM_RISCV_FENCE_H */
+2
tools/include/asm/barrier.h
··· 8 8 #include "../../arch/arm64/include/asm/barrier.h" 9 9 #elif defined(__powerpc__) 10 10 #include "../../arch/powerpc/include/asm/barrier.h" 11 + #elif defined(__riscv) 12 + #include "../../arch/riscv/include/asm/barrier.h" 11 13 #elif defined(__s390__) 12 14 #include "../../arch/s390/include/asm/barrier.h" 13 15 #elif defined(__sh__)