aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/patchkey.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-01-27 15:43:41 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-27 15:43:41 -0500
commitf7b548fa3d74f0db9af4fd41fbef973231d384fd (patch)
treeef4eee8f3b293599e378e30c58903eab425ecb49 /include/linux/patchkey.h
parent95f9354b4cd23902e0556348325366378cb5e621 (diff)
parent889a7a6a5d5e64063effd40056bdc7b8fb336bd1 (diff)
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: percpu, x86: Fix percpu_xchg_op() x86: Remove left over system_64.h x86-64: Don't use pointer to out-of-scope variable in dump_trace()
Diffstat (limited to 'include/linux/patchkey.h')
0 files changed, 0 insertions, 0 deletions
* @i: integer value to add * @v: pointer of type atomic_t * * Atomically adds @i to @v and returns the result * Note that the guaranteed useful range of an atomic_t is only 24 bits. */ static inline int atomic_add_return(int i, atomic_t *v) { unsigned long flags; int temp; local_irq_save(flags); temp = v->counter; temp += i; v->counter = temp; local_irq_restore(flags); return temp; } /** * atomic_sub_return - subtract integer from atomic variable * @i: integer value to subtract * @v: pointer of type atomic_t * * Atomically subtracts @i from @v and returns the result * Note that the guaranteed useful range of an atomic_t is only 24 bits. */ static inline int atomic_sub_return(int i, atomic_t *v) { unsigned long flags; int temp; local_irq_save(flags); temp = v->counter; temp -= i; v->counter = temp; local_irq_restore(flags); return temp; } static inline int atomic_add_negative(int i, atomic_t *v) { return atomic_add_return(i, v) < 0; } static inline void atomic_add(int i, atomic_t *v) { atomic_add_return(i, v); } static inline void atomic_sub(int i, atomic_t *v) { atomic_sub_return(i, v); } static inline void atomic_inc(atomic_t *v) { atomic_add_return(1, v); } static inline void atomic_dec(atomic_t *v) { atomic_sub_return(1, v); } #define atomic_dec_return(v) atomic_sub_return(1, (v)) #define atomic_inc_return(v) atomic_add_return(1, (v)) #define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0) #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) #define atomic_add_unless(v, a, u) \ ({ \ int c, old; \ c = atomic_read(v); \ while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ c = old; \ c != (u); \ }) #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) { unsigned long flags; mask = ~mask; local_irq_save(flags); *addr &= mask; local_irq_restore(flags); } #define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) #define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) /* Atomic operations are already serializing on MN10300??? */ #define smp_mb__before_atomic_dec() barrier() #define smp_mb__after_atomic_dec() barrier() #define smp_mb__before_atomic_inc() barrier() #define smp_mb__after_atomic_inc() barrier() #include <asm-generic/atomic.h> #endif /* __KERNEL__ */ #endif /* _ASM_ATOMIC_H */