Skip to content

Commit ec2760c

Browse files
authored
Merge pull request #29 from ARM-software/integration
Merge osq_lock from integration to master
2 parents e59d728 + 478677d commit ec2760c

File tree

6 files changed

+1058
-1
lines changed

6 files changed

+1058
-1
lines changed

benchmarks/lockhammer/Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ TEST_TARGETS=lh_swap_mutex \
3131
lh_queued_spinlock \
3232
lh_empty \
3333
lh_jvm_objectmonitor \
34-
lh_tbb_spin_rw_mutex
34+
lh_tbb_spin_rw_mutex \
35+
lh_osq_lock
3536

3637
ifeq ($(TARGET_ARCH),aarch64)
3738
TEST_TARGETS+=lh_hybrid_spinlock \
@@ -55,6 +56,9 @@ lh_hybrid_spinlock: ../../ext/linux/hybrid_spinlock.h include/atomics.h ../../ex
5556
lh_hybrid_spinlock_fastdequeue: ../../ext/linux/hybrid_spinlock_fastdequeue.h include/atomics.h ../../ext/linux/include/lk_atomics.h src/lockhammer.c
5657
${CC} ${CFLAGS} -DATOMIC_TEST=\"$<\" src/lockhammer.c -o build/$@ ${LDFLAGS}
5758

59+
lh_osq_lock: ../../ext/linux/osq_lock.h ../../ext/linux/include/lk_atomics.h ../../ext/linux/include/lk_barrier.h ../../ext/linux/include/lk_cmpxchg.h include/atomics.h src/lockhammer.c
60+
${CC} ${CFLAGS} -DATOMIC_TEST=\"$<\" src/lockhammer.c -o build/$@ ${LDFLAGS}
61+
5862
lh_queued_spinlock: ../../ext/linux/queued_spinlock.h include/atomics.h ../../ext/linux/include/lk_atomics.h src/lockhammer.c
5963
${CC} ${CFLAGS} -DATOMIC_TEST=\"$<\" src/lockhammer.c -o build/$@ ${LDFLAGS}
6064

ext/linux/include/lk_atomics.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,3 +392,7 @@ do { \
392392

393393
#define arch_mcs_spin_unlock_contended(l) \
394394
smp_store_release((l), 1)
395+
396+
#define ATOMIC_INIT(i) { (i) }
397+
#define atomic_read(v) READ_ONCE((v)->counter)
398+
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))

ext/linux/include/lk_barrier.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
3+
/* Based on Linux kernel 4.16.10
4+
* arch/arm64/include/asm/barrier.h
5+
* arch/x86/include/asm/barrier.h
6+
* https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?h=v4.16.10&id=b3fdf8284efbc5020dfbd0a28150637189076115
7+
*/
8+
9+
#ifndef __ASM_BARRIER_H
10+
#define __ASM_BARRIER_H
11+
12+
#include "lk_cmpxchg.h"
13+
14+
#if defined(__x86_64__)
15+
16+
#define mb() asm volatile("mfence":::"memory")
17+
#define rmb() asm volatile("lfence":::"memory")
18+
#define wmb() asm volatile("sfence" ::: "memory")
19+
#define dma_rmb() barrier()
20+
#define dma_wmb() barrier()
21+
#define smp_mb() asm volatile("lock; addl $0,-4(%%rsp)" ::: "memory", "cc")
22+
#define smp_rmb() dma_rmb()
23+
#define smp_wmb() barrier()
24+
#define smp_store_mb(var, value) do { (void)xchg(&var, value); } while (0)
25+
26+
27+
/* Atomic operations are already serializing on x86 */
28+
#define __smp_mb__before_atomic() barrier()
29+
#define __smp_mb__after_atomic() barrier()
30+
31+
32+
#elif defined(__aarch64__)
33+
34+
#define isb() asm volatile("isb" : : : "memory")
35+
#define dmb(opt) asm volatile("dmb " #opt : : : "memory")
36+
#define dsb(opt) asm volatile("dsb " #opt : : : "memory")
37+
#define psb_csync() asm volatile("hint #17" : : : "memory")
38+
#define csdb() asm volatile("hint #20" : : : "memory")
39+
#define mb() dsb(sy)
40+
#define rmb() dsb(ld)
41+
#define wmb() dsb(st)
42+
#define dma_rmb() dmb(oshld)
43+
#define dma_wmb() dmb(oshst)
44+
#define smp_mb() dmb(ish)
45+
#define smp_rmb() dmb(ishld)
46+
#define smp_wmb() dmb(ishst)
47+
48+
#else /* No Arch */
49+
/* TODO: No Arch Default */
50+
#endif /* __x86_64__ */
51+
52+
#endif /* __ASM_BARRIER_H */

0 commit comments

Comments
 (0)