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

tools/include: implement a couple of atomic_t ops

Patch series "tools: testing: Use existing atomic.h for vma/maple tests",
v2.

De-duplicating this lets us delete a bit of code.

Ulterior motive: I'm working on a new set of the userspace-based unit
tests, which will need the atomics API too. That would involve even more
duplication, so while the win in this patchset alone is very minimal, it
looks a lot more significant with my other WIP patchset.

I've tested these commands:

make -C tools/testing/vma -j
tools/testing/vma/vma

make -C tools/testing/radix-tree -j
tools/testing/radix-tree/maple

Note the EXTRA_CFLAGS patch is actually orthogonal, let me know if you'd
prefer I send it separately.


This patch (of 4):

The VMA tests need an operation equivalent to atomic_inc_unless_negative()
to implement a fake mapping_map_writable(). Adding it will enable them to
switch to the shared atomic headers and simplify that fake implementation.

In order to add that, also add atomic_try_cmpxchg() which can be used to
implement it. This is copied from Documentation/atomic_t.txt. Then,
implement atomic_inc_unless_negative() itself based on the
raw_atomic_dec_unless_positive() in
include/linux/atomic/atomic-arch-fallback.h.

There's no present need for a highly-optimised version of this (nor any
reason to think this implementation is sub-optimal on x86) so just
implement this with generic C, no x86-specifics.

Link: https://lkml.kernel.org/r/20250828-b4-vma-no-atomic-h-v2-0-02d146a58ed2@google.com
Link: https://lkml.kernel.org/r/20250828-b4-vma-no-atomic-h-v2-1-02d146a58ed2@google.com
Signed-off-by: Brendan Jackman <jackmanb@google.com>
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
Cc: Jann Horn <jannh@google.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Brendan Jackman and committed by
Andrew Morton
ff0db419 1e332f30

+22
+22
tools/include/linux/atomic.h
··· 12 12 #define atomic_cmpxchg_release atomic_cmpxchg 13 13 #endif /* atomic_cmpxchg_relaxed */ 14 14 15 + static inline bool atomic_try_cmpxchg(atomic_t *ptr, int *oldp, int new) 16 + { 17 + int ret, old = *oldp; 18 + 19 + ret = atomic_cmpxchg(ptr, old, new); 20 + if (ret != old) 21 + *oldp = ret; 22 + return ret == old; 23 + } 24 + 25 + static inline bool atomic_inc_unless_negative(atomic_t *v) 26 + { 27 + int c = atomic_read(v); 28 + 29 + do { 30 + if (unlikely(c < 0)) 31 + return false; 32 + } while (!atomic_try_cmpxchg(v, &c, c + 1)); 33 + 34 + return true; 35 + } 36 + 15 37 #endif /* __TOOLS_LINUX_ATOMIC_H */