Skip to content

Commit e6ce9d7

Browse files
ubizjakingomolnar
authored andcommitted
locking/atomic: Add generic try_cmpxchg{,64}_local() support
Add generic support for try_cmpxchg{,64}_local() and their falbacks. These provides the generic try_cmpxchg_local family of functions from the arch_ prefixed version, also adding explicit instrumentation. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Link: https://lore.kernel.org/r/20230405141710.3551-2-ubizjak@gmail.com Cc: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 286deb7 commit e6ce9d7

4 files changed

Lines changed: 47 additions & 3 deletions

File tree

include/linux/atomic/atomic-arch-fallback.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,28 @@
217217

218218
#endif /* arch_try_cmpxchg64_relaxed */
219219

220+
#ifndef arch_try_cmpxchg_local
221+
#define arch_try_cmpxchg_local(_ptr, _oldp, _new) \
222+
({ \
223+
typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
224+
___r = arch_cmpxchg_local((_ptr), ___o, (_new)); \
225+
if (unlikely(___r != ___o)) \
226+
*___op = ___r; \
227+
likely(___r == ___o); \
228+
})
229+
#endif /* arch_try_cmpxchg_local */
230+
231+
#ifndef arch_try_cmpxchg64_local
232+
#define arch_try_cmpxchg64_local(_ptr, _oldp, _new) \
233+
({ \
234+
typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
235+
___r = arch_cmpxchg64_local((_ptr), ___o, (_new)); \
236+
if (unlikely(___r != ___o)) \
237+
*___op = ___r; \
238+
likely(___r == ___o); \
239+
})
240+
#endif /* arch_try_cmpxchg64_local */
241+
220242
#ifndef arch_atomic_read_acquire
221243
static __always_inline int
222244
arch_atomic_read_acquire(const atomic_t *v)
@@ -2646,4 +2668,4 @@ arch_atomic64_dec_if_positive(atomic64_t *v)
26462668
#endif
26472669

26482670
#endif /* _LINUX_ATOMIC_FALLBACK_H */
2649-
// 00071fffa021cec66f6290d706d69c91df87bade
2671+
// ad2e2b4d168dbc60a73922616047a9bfa446af36

include/linux/atomic/atomic-instrumented.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2132,6 +2132,24 @@ atomic_long_dec_if_positive(atomic_long_t *v)
21322132
arch_sync_cmpxchg(__ai_ptr, __VA_ARGS__); \
21332133
})
21342134

2135+
#define try_cmpxchg_local(ptr, oldp, ...) \
2136+
({ \
2137+
typeof(ptr) __ai_ptr = (ptr); \
2138+
typeof(oldp) __ai_oldp = (oldp); \
2139+
instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
2140+
instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
2141+
arch_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
2142+
})
2143+
2144+
#define try_cmpxchg64_local(ptr, oldp, ...) \
2145+
({ \
2146+
typeof(ptr) __ai_ptr = (ptr); \
2147+
typeof(oldp) __ai_oldp = (oldp); \
2148+
instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
2149+
instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
2150+
arch_try_cmpxchg64_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
2151+
})
2152+
21352153
#define cmpxchg_double(ptr, ...) \
21362154
({ \
21372155
typeof(ptr) __ai_ptr = (ptr); \
@@ -2149,4 +2167,4 @@ atomic_long_dec_if_positive(atomic_long_t *v)
21492167
})
21502168

21512169
#endif /* _LINUX_ATOMIC_INSTRUMENTED_H */
2152-
// 1b485de9cbaa4900de59e14ee2084357eaeb1c3a
2170+
// 97fe4d79aa058d2164df824632cbc4f716d2a407

scripts/atomic/gen-atomic-fallback.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ for cmpxchg in "cmpxchg" "cmpxchg64"; do
225225
gen_try_cmpxchg_fallbacks "${cmpxchg}"
226226
done
227227

228+
for cmpxchg in "cmpxchg_local" "cmpxchg64_local"; do
229+
gen_try_cmpxchg_fallback "${cmpxchg}" ""
230+
done
231+
228232
grep '^[a-z]' "$1" | while read name meta args; do
229233
gen_proto "${meta}" "${name}" "atomic" "int" ${args}
230234
done

scripts/atomic/gen-atomic-instrumented.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ for xchg in "xchg" "cmpxchg" "cmpxchg64" "try_cmpxchg" "try_cmpxchg64"; do
173173
done
174174
done
175175

176-
for xchg in "cmpxchg_local" "cmpxchg64_local" "sync_cmpxchg"; do
176+
for xchg in "cmpxchg_local" "cmpxchg64_local" "sync_cmpxchg" "try_cmpxchg_local" "try_cmpxchg64_local" ; do
177177
gen_xchg "${xchg}" "" ""
178178
printf "\n"
179179
done

0 commit comments

Comments
 (0)