mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
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/[email protected] Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Brendan Jackman <[email protected]> Reviewed-by: Pedro Falcato <[email protected]> Cc: Jann Horn <[email protected]> Cc: Liam Howlett <[email protected]> Cc: Lorenzo Stoakes <[email protected]> Cc: Vlastimil Babka <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
38 lines
801 B
C
38 lines
801 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __TOOLS_LINUX_ATOMIC_H
|
|
#define __TOOLS_LINUX_ATOMIC_H
|
|
|
|
#include <asm/atomic.h>
|
|
|
|
void atomic_long_set(atomic_long_t *v, long i);
|
|
|
|
/* atomic_cmpxchg_relaxed */
|
|
#ifndef atomic_cmpxchg_relaxed
|
|
#define atomic_cmpxchg_relaxed atomic_cmpxchg
|
|
#define atomic_cmpxchg_release atomic_cmpxchg
|
|
#endif /* atomic_cmpxchg_relaxed */
|
|
|
|
static inline bool atomic_try_cmpxchg(atomic_t *ptr, int *oldp, int new)
|
|
{
|
|
int ret, old = *oldp;
|
|
|
|
ret = atomic_cmpxchg(ptr, old, new);
|
|
if (ret != old)
|
|
*oldp = ret;
|
|
return ret == old;
|
|
}
|
|
|
|
static inline bool atomic_inc_unless_negative(atomic_t *v)
|
|
{
|
|
int c = atomic_read(v);
|
|
|
|
do {
|
|
if (unlikely(c < 0))
|
|
return false;
|
|
} while (!atomic_try_cmpxchg(v, &c, c + 1));
|
|
|
|
return true;
|
|
}
|
|
|
|
#endif /* __TOOLS_LINUX_ATOMIC_H */
|