Skip to content

Commit 02ba8ad

Browse files
committed
benchmarks/lockhammer/include/cpu_relax.h
Implements the __cpu_relax() macro whose behavior can be modified using the USE_RELAX makefile variable. Change-Id: Ic3dbf09bdf6c852a1d94af909c2de7c158741db2
1 parent bcd1ba0 commit 02ba8ad

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright (c) 2017-2025, The Linux Foundation. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: BSD-3-Clause
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are
8+
* met:
9+
* * Redistributions of source code must retain the above copyright
10+
* notice, this list of conditions and the following disclaimer.
11+
* * Redistributions in binary form must reproduce the above
12+
* copyright notice, this list of conditions and the following
13+
* disclaimer in the documentation and/or other materials provided
14+
* with the distribution.
15+
* * Neither the name of The Linux Foundation nor the names of its
16+
* contributors may be used to endorse or promote products derived
17+
* from this software without specific prior written permission.
18+
*
19+
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
20+
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
22+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
23+
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
26+
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27+
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
28+
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
29+
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+
*/
31+
32+
#ifndef CPU_RELAX_H
33+
#define CPU_RELAX_H
34+
35+
36+
#ifndef CPU_RELAX_ITERATIONS
37+
#define CPU_RELAX_ITERATIONS 1
38+
#endif
39+
40+
static inline void __cpu_relax(void) {
41+
for (unsigned long i = 0; i < CPU_RELAX_ITERATIONS; i++) {
42+
#ifdef __aarch64__
43+
#if defined(RELAX_IS_ISB)
44+
asm volatile ("isb" : : : "memory" );
45+
#elif defined(RELAX_IS_NOP)
46+
asm volatile ("nop" : : : "memory");
47+
#elif defined(RELAX_IS_EMPTY)
48+
asm volatile ("" : : : "memory");
49+
#elif defined(RELAX_IS_NOTHING)
50+
51+
#endif
52+
#endif // __aarch64__
53+
54+
#ifdef __x86_64__
55+
56+
#if defined(RELAX_IS_PAUSE)
57+
// RELAX_IS_PAUSE is the implementation for x86 in jdk-9
58+
asm volatile ("rep; nop"); // aka pause
59+
#elif defined(RELAX_IS_EMPTY)
60+
asm volatile ("" : : : "memory");
61+
#elif defined(RELAX_IS_NOTHING)
62+
63+
#endif
64+
#endif // __x86_64__
65+
66+
}
67+
}
68+
69+
#endif // CPU_RELAX_H
70+
71+
/* vim: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */

0 commit comments

Comments
 (0)