cregit-Linux how code gets into the kernel

Release 4.14 arch/x86/include/asm/atomic64_64.h

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_X86_ATOMIC64_64_H

#define _ASM_X86_ATOMIC64_64_H

#include <linux/types.h>
#include <asm/alternative.h>
#include <asm/cmpxchg.h>

/* The 64-bit atomic type */


#define ATOMIC64_INIT(i)	{ (i) }

/**
 * atomic64_read - read atomic64 variable
 * @v: pointer of type atomic64_t
 *
 * Atomically reads the value of @v.
 * Doesn't imply a read memory barrier.
 */

static inline long atomic64_read(const atomic64_t *v) { return READ_ONCE((v)->counter); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1777.27%125.00%
Pranith Kumar29.09%125.00%
Anton Blanchard29.09%125.00%
Peter Zijlstra14.55%125.00%
Total22100.00%4100.00%

/** * atomic64_set - set atomic64 variable * @v: pointer to type atomic64_t * @i: required value * * Atomically sets the value of @v to @i. */
static inline void atomic64_set(atomic64_t *v, long i) { WRITE_ONCE(v->counter, i); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1982.61%150.00%
Peter Zijlstra417.39%150.00%
Total23100.00%2100.00%

/** * atomic64_add - add integer to atomic64 variable * @i: integer value to add * @v: pointer to type atomic64_t * * Atomically adds @i to @v. */
static __always_inline void atomic64_add(long i, atomic64_t *v) { asm volatile(LOCK_PREFIX "addq %1,%0" : "=m" (v->counter) : "er" (i), "m" (v->counter)); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1694.12%150.00%
Hagen Paul Pfeifer15.88%150.00%
Total17100.00%2100.00%

/** * atomic64_sub - subtract the atomic64 variable * @i: integer value to subtract * @v: pointer to type atomic64_t * * Atomically subtracts @i from @v. */
static inline void atomic64_sub(long i, atomic64_t *v) { asm volatile(LOCK_PREFIX "subq %1,%0" : "=m" (v->counter) : "er" (i), "m" (v->counter)); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst17100.00%1100.00%
Total17100.00%1100.00%

/** * atomic64_sub_and_test - subtract value from variable and test result * @i: integer value to subtract * @v: pointer to type atomic64_t * * Atomically subtracts @i from @v and returns * true if the result is zero, or false for all * other cases. */
static inline bool atomic64_sub_and_test(long i, atomic64_t *v) { GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, "er", i, "%0", e); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra1546.88%120.00%
Brian Gerst1340.62%120.00%
H. Peter Anvin412.50%360.00%
Total32100.00%5100.00%

/** * atomic64_inc - increment atomic64 variable * @v: pointer to type atomic64_t * * Atomically increments @v by 1. */
static __always_inline void atomic64_inc(atomic64_t *v) { asm volatile(LOCK_PREFIX "incq %0" : "=m" (v->counter) : "m" (v->counter)); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1392.86%150.00%
Hagen Paul Pfeifer17.14%150.00%
Total14100.00%2100.00%

/** * atomic64_dec - decrement atomic64 variable * @v: pointer to type atomic64_t * * Atomically decrements @v by 1. */
static __always_inline void atomic64_dec(atomic64_t *v) { asm volatile(LOCK_PREFIX "decq %0" : "=m" (v->counter) : "m" (v->counter)); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1392.86%150.00%
Hagen Paul Pfeifer17.14%150.00%
Total14100.00%2100.00%

/** * atomic64_dec_and_test - decrement and test * @v: pointer to type atomic64_t * * Atomically decrements @v by 1 and * returns true if the result is 0, or false for all other * cases. */
static inline bool atomic64_dec_and_test(atomic64_t *v) { GEN_UNARY_RMWcc(LOCK_PREFIX "decq", v->counter, "%0", e); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra1352.00%125.00%
Brian Gerst1040.00%125.00%
H. Peter Anvin28.00%250.00%
Total25100.00%4100.00%

/** * atomic64_inc_and_test - increment and test * @v: pointer to type atomic64_t * * Atomically increments @v by 1 * and returns true if the result is zero, or false for all * other cases. */
static inline bool atomic64_inc_and_test(atomic64_t *v) { GEN_UNARY_RMWcc(LOCK_PREFIX "incq", v->counter, "%0", e); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra1352.00%125.00%
Brian Gerst1040.00%125.00%
H. Peter Anvin28.00%250.00%
Total25100.00%4100.00%

/** * atomic64_add_negative - add and test if negative * @i: integer value to add * @v: pointer to type atomic64_t * * Atomically adds @i to @v and returns true * if the result is negative, or false when * result is greater than or equal to zero. */
static inline bool atomic64_add_negative(long i, atomic64_t *v) { GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, "er", i, "%0", s); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra1546.88%120.00%
Brian Gerst1340.62%120.00%
H. Peter Anvin412.50%360.00%
Total32100.00%5100.00%

/** * atomic64_add_return - add and return * @i: integer value to add * @v: pointer to type atomic64_t * * Atomically adds @i to @v and returns @i + @v */
static __always_inline long atomic64_add_return(long i, atomic64_t *v) { return i + xadd(&v->counter, i); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1762.96%133.33%
Jeremy Fitzhardinge933.33%133.33%
Hagen Paul Pfeifer13.70%133.33%
Total27100.00%3100.00%


static inline long atomic64_sub_return(long i, atomic64_t *v) { return atomic64_add_return(-i, v); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst23100.00%1100.00%
Total23100.00%1100.00%


static inline long atomic64_fetch_add(long i, atomic64_t *v) { return xadd(&v->counter, i); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra25100.00%1100.00%
Total25100.00%1100.00%


static inline long atomic64_fetch_sub(long i, atomic64_t *v) { return xadd(&v->counter, -i); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra26100.00%1100.00%
Total26100.00%1100.00%

#define atomic64_inc_return(v) (atomic64_add_return(1, (v))) #define atomic64_dec_return(v) (atomic64_sub_return(1, (v)))
static inline long atomic64_cmpxchg(atomic64_t *v, long old, long new) { return cmpxchg(&v->counter, old, new); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst30100.00%1100.00%
Total30100.00%1100.00%

#define atomic64_try_cmpxchg atomic64_try_cmpxchg
static __always_inline bool atomic64_try_cmpxchg(atomic64_t *v, s64 *old, long new) { return try_cmpxchg(&v->counter, old, new); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra3096.77%150.00%
Dmitriy Vyukov13.23%150.00%
Total31100.00%2100.00%


static inline long atomic64_xchg(atomic64_t *v, long new) { return xchg(&v->counter, new); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst25100.00%1100.00%
Total25100.00%1100.00%

/** * atomic64_add_unless - add unless the number is a given value * @v: pointer of type atomic64_t * @a: the amount to add to v... * @u: ...unless v is equal to u. * * Atomically adds @a to @v, so long as it was not @u. * Returns the old value of @v. */
static inline bool atomic64_add_unless(atomic64_t *v, long a, long u) { s64 c = atomic64_read(v); do { if (unlikely(c == u)) return false; } while (!atomic64_try_cmpxchg(v, &c, c + a)); return true; }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst4372.88%125.00%
Peter Zijlstra1423.73%125.00%
H. Peter Anvin11.69%125.00%
Dmitriy Vyukov11.69%125.00%
Total59100.00%4100.00%

#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) /* * atomic64_dec_if_positive - decrement by 1 if old value positive * @v: pointer of type atomic_t * * The function returns the old value of *v minus 1, even if * the atomic variable, v, was not decremented. */
static inline long atomic64_dec_if_positive(atomic64_t *v) { s64 dec, c = atomic64_read(v); do { dec = c - 1; if (unlikely(dec < 0)) break; } while (!atomic64_try_cmpxchg(v, &c, dec)); return dec; }

Contributors

PersonTokensPropCommitsCommitProp
Luca Barbieri4578.95%133.33%
Peter Zijlstra1119.30%133.33%
Dmitriy Vyukov11.75%133.33%
Total57100.00%3100.00%


static inline void atomic64_and(long i, atomic64_t *v) { asm volatile(LOCK_PREFIX "andq %1,%0" : "+m" (v->counter) : "er" (i) : "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov1588.24%150.00%
Peter Zijlstra211.76%150.00%
Total17100.00%2100.00%


static inline long atomic64_fetch_and(long i, atomic64_t *v) { s64 val = atomic64_read(v); do { } while (!atomic64_try_cmpxchg(v, &val, val & i)); return val; }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov4093.02%266.67%
Peter Zijlstra36.98%133.33%
Total43100.00%3100.00%


static inline void atomic64_or(long i, atomic64_t *v) { asm volatile(LOCK_PREFIX "orq %1,%0" : "+m" (v->counter) : "er" (i) : "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov1482.35%150.00%
Peter Zijlstra317.65%150.00%
Total17100.00%2100.00%


static inline long atomic64_fetch_or(long i, atomic64_t *v) { s64 val = atomic64_read(v); do { } while (!atomic64_try_cmpxchg(v, &val, val | i)); return val; }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov3888.37%250.00%
Peter Zijlstra511.63%250.00%
Total43100.00%4100.00%


static inline void atomic64_xor(long i, atomic64_t *v) { asm volatile(LOCK_PREFIX "xorq %1,%0" : "+m" (v->counter) : "er" (i) : "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov17100.00%1100.00%
Total17100.00%1100.00%


static inline long atomic64_fetch_xor(long i, atomic64_t *v) { s64 val = atomic64_read(v); do { } while (!atomic64_try_cmpxchg(v, &val, val ^ i)); return val; }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov4093.02%250.00%
Peter Zijlstra36.98%250.00%
Total43100.00%4100.00%

#endif /* _ASM_X86_ATOMIC64_64_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst33743.82%15.26%
Peter Zijlstra18724.32%631.58%
Dmitriy Vyukov16721.72%210.53%
Luca Barbieri465.98%15.26%
H. Peter Anvin131.69%315.79%
Jeremy Fitzhardinge91.17%15.26%
Hagen Paul Pfeifer40.52%15.26%
Anton Blanchard20.26%15.26%
Pranith Kumar20.26%15.26%
Arun Sharma10.13%15.26%
Greg Kroah-Hartman10.13%15.26%
Total769100.00%19100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.