tools include: Add basic atomic.h implementation from the kernel sources
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: da6d8567512df11e0473b710c07de87efde5709c Gitweb: http://git.kernel.org/tip/da6d8567512df11e0473b710c07de87efde5709c Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 7 Apr 2015 11:53:41 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 8 May 2015 16:11:05 -0300
tools include: Add basic atomic.h implementation from the kernel sources
Uses the arch/x86/ kernel code for x86_64/i386, fallbacking to a gcc intrinsics implementation that has been tested in at least sparc64.
Will be used for reference counting in tools/perf.
Acked-by David Ahern <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/arch/x86/include/asm/atomic.h | 65 ++++++++++++++++++++++++++++++++++ tools/arch/x86/include/asm/rmwcc.h | 41 +++++++++++++++++++++ tools/include/asm-generic/atomic-gcc.h | 63 ++++++++++++++++++++++++++++++++ tools/include/asm/atomic.h | 10 ++++++ tools/include/linux/atomic.h | 6 ++++ tools/include/linux/types.h | 4 +++ tools/perf/MANIFEST | 4 +++ 7 files changed, 193 insertions(+)
tools/arch/x86/include/asm/atomic.h new file +65 -0
@@ -0,0 +1,65 @@ +#ifndef _TOOLS_LINUX_ASM_X86_ATOMIC_H +#define _TOOLS_LINUX_ASM_X86_ATOMIC_H + +#include <linux/compiler.h> +#include <linux/types.h> +#include "rmwcc.h" + +#define LOCK_PREFIX "\n\tlock; " + +/* +* Atomic operations that C can't guarantee us. Useful for +* resource counting etc.. +*/ + +#define ATOMIC_INIT (i) { (i) } + +/** +* atomic_read - read atomic variable +* @v: pointer of type atomic_t +* +* Atomically reads the value of @v. +*/ +static inline int atomic_read (const atomic_t *v) +{ +return ACCESS_ONCE ((v)->counter); +} + +/** +* atomic_set - set atomic variable +* @v: pointer of type atomic_t +* @i: required value +* +* Atomically sets the value of @v to @i. +*/ +static inline void atomic_set (atomic_t *v,int i) +{ + v->counter = i; +} + +/** +* atomic_inc - increment atomic variable +* @v: pointer of type atomic_t +* +* Atomically increments @v by 1. +*/ +static inline void atomic_inc (atomic_t *v) +{ + asmvolatile (LOCK_PREFIX "incl %0" + :"+m" (v->counter)); +} + +/** +* atomic_dec_and_test - decrement and test +* @v: pointer of type atomic_t +* +* Atomically decrements @v by 1 and +* returns true if the result is 0, or false for all other +* cases. +*/ +static inline int atomic_dec_and_test (atomic_t *v) +{ +GEN_UNARY_RMWcc (LOCK_PREFIX "decl" , v->counter,"%0" ,"e" ); +} + +#endif /* _TOOLS_LINUX_ASM_X86_ATOMIC_H */
tools/arch/x86/include/asm/rmwcc.h new file +41 -0
41 lines not on this page · raw message
tools/include/asm-generic/atomic-gcc.h new file +63 -0
63 lines not on this page · raw message
tools/include/asm/atomic.h new file +10 -0
@@ -0,0 +1,10 @@ +#ifndef __TOOLS_LINUX_ASM_ATOMIC_H +#define __TOOLS_LINUX_ASM_ATOMIC_H + +#if defined(__i386__) || defined(__x86_64__) +#include "../../arch/x86/include/asm/atomic.h" +#else +#include <asm-generic/atomic-gcc.h> +#endif + +#endif /* __TOOLS_LINUX_ASM_ATOMIC_H */
tools/include/linux/atomic.h new file +6 -0
@@ -0,0 +1,6 @@ +#ifndef __TOOLS_LINUX_ATOMIC_H +#define __TOOLS_LINUX_ATOMIC_H + +#include <asm/atomic.h> + +#endif /* __TOOLS_LINUX_ATOMIC_H */
tools/include/linux/types.h +4 -0
@@ -60,6 +60,10 @@ typedef __u32 __bitwise __be32;typedef __u64 __bitwise __le64 ;typedef __u64 __bitwise __be64 ; +typedef struct { +int counter; +}atomic_t ; +struct list_head {struct list_head *next, *prev; };
tools/perf/MANIFEST +4 -0
@@ -14,11 +14,14 @@ tools/arch/x86/include/asm/barrier.h tools/arch/xtensa/include/asm/barrier.h tools/scripts tools/build +tools/arch/x86/include/asm/atomic.h +tools/arch/x86/include/asm/rmwcc.h tools/lib/traceevent tools/lib/api tools/lib/symbol/kallsyms.c tools/lib/symbol/kallsyms.h tools/lib/util/find_next_bit.c +tools/include/asm/atomic.h tools/include/asm/barrier.h tools/include/asm/bug.h tools/include/asm-generic/barrier.h
@@ -32,6 +35,7 @@ tools/include/asm-generic/bitops/fls64.h tools/include/asm-generic/bitops/fls.h tools/include/asm-generic/bitops/hweight.h tools/include/asm-generic/bitops.h +tools/include/linux/atomic.h tools/include/linux/bitops.h tools/include/linux/compiler.h tools/include/linux/export.h