Skip to content

Commit 6d74d17

Browse files
charlie-rivospalmer-dabbelt
authored andcommitted
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 <[email protected]> Reviewed-by: Andrea Parri <[email protected]> Link: https://lore.kernel.org/r/20240806-optimize_ring_buffer_read_riscv-v2-1-ca7e193ae198@rivosinc.com Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 8400291 commit 6d74d17

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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 */
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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 */

tools/include/asm/barrier.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include "../../arch/arm64/include/asm/barrier.h"
99
#elif defined(__powerpc__)
1010
#include "../../arch/powerpc/include/asm/barrier.h"
11+
#elif defined(__riscv)
12+
#include "../../arch/riscv/include/asm/barrier.h"
1113
#elif defined(__s390__)
1214
#include "../../arch/s390/include/asm/barrier.h"
1315
#elif defined(__sh__)

0 commit comments

Comments
 (0)