cregit-Linux how code gets into the kernel

Release 4.18 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) }

/**
 * arch_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 arch_atomic64_read(const atomic64_t *v) { return READ_ONCE((v)->counter); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1672.73%120.00%
Anton Blanchard29.09%120.00%
Pranith Kumar29.09%120.00%
Peter Zijlstra14.55%120.00%
Dmitriy Vyukov14.55%120.00%
Total22100.00%5100.00%

/** * arch_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 arch_atomic64_set(atomic64_t *v, long i) { WRITE_ONCE(v->counter, i); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1878.26%133.33%
Peter Zijlstra417.39%133.33%
Dmitriy Vyukov14.35%133.33%
Total23100.00%3100.00%

/** * arch_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 arch_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 Gerst1588.24%133.33%
Dmitriy Vyukov15.88%133.33%
Hagen Paul Pfeifer15.88%133.33%
Total17100.00%3100.00%

/** * arch_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 arch_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 Gerst1694.12%150.00%
Dmitriy Vyukov15.88%150.00%
Total17100.00%2100.00%

/** * arch_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 arch_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%116.67%
Brian Gerst1237.50%116.67%
H. Peter Anvin412.50%350.00%
Dmitriy Vyukov13.12%116.67%
Total32100.00%6100.00%

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

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1285.71%133.33%
Dmitriy Vyukov17.14%133.33%
Hagen Paul Pfeifer17.14%133.33%
Total14100.00%3100.00%

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

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1285.71%133.33%
Hagen Paul Pfeifer17.14%133.33%
Dmitriy Vyukov17.14%133.33%
Total14100.00%3100.00%

/** * arch_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 arch_atomic64_dec_and_test(atomic64_t *v) { GEN_UNARY_RMWcc(LOCK_PREFIX "decq", v->counter, "%0", e); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra1352.00%120.00%
Brian Gerst936.00%120.00%
H. Peter Anvin28.00%240.00%
Dmitriy Vyukov14.00%120.00%
Total25100.00%5100.00%

/** * arch_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 arch_atomic64_inc_and_test(atomic64_t *v) { GEN_UNARY_RMWcc(LOCK_PREFIX "incq", v->counter, "%0", e); }

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra1352.00%120.00%
Brian Gerst936.00%120.00%
H. Peter Anvin28.00%240.00%
Dmitriy Vyukov14.00%120.00%
Total25100.00%5100.00%

/** * arch_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 arch_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%116.67%
Brian Gerst1237.50%116.67%
H. Peter Anvin412.50%350.00%
Dmitriy Vyukov13.12%116.67%
Total32100.00%6100.00%

/** * arch_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 arch_atomic64_add_return(long i, atomic64_t *v) { return i + xadd(&v->counter, i); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst1659.26%125.00%
Jeremy Fitzhardinge933.33%125.00%
Dmitriy Vyukov13.70%125.00%
Hagen Paul Pfeifer13.70%125.00%
Total27100.00%4100.00%


static inline long arch_atomic64_sub_return(long i, atomic64_t *v) { return arch_atomic64_add_return(-i, v); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst2191.30%150.00%
Dmitriy Vyukov28.70%150.00%
Total23100.00%2100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra2496.00%150.00%
Dmitriy Vyukov14.00%150.00%
Total25100.00%2100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra2596.15%150.00%
Dmitriy Vyukov13.85%150.00%
Total26100.00%2100.00%

#define arch_atomic64_inc_return(v) (arch_atomic64_add_return(1, (v))) #define arch_atomic64_dec_return(v) (arch_atomic64_sub_return(1, (v)))
static inline long arch_atomic64_cmpxchg(atomic64_t *v, long old, long new) { return arch_cmpxchg(&v->counter, old, new); }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst2893.33%150.00%
Dmitriy Vyukov26.67%150.00%
Total30100.00%2100.00%

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

Contributors

PersonTokensPropCommitsCommitProp
Peter Zijlstra2993.55%133.33%
Dmitriy Vyukov26.45%266.67%
Total31100.00%3100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst2496.00%150.00%
Dmitriy Vyukov14.00%150.00%
Total25100.00%2100.00%

/** * arch_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 arch_atomic64_add_unless(atomic64_t *v, long a, long u) { s64 c = arch_atomic64_read(v); do { if (unlikely(c == u)) return false; } while (!arch_atomic64_try_cmpxchg(v, &c, c + a)); return true; }

Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst4169.49%120.00%
Peter Zijlstra1322.03%120.00%
Dmitriy Vyukov46.78%240.00%
H. Peter Anvin11.69%120.00%
Total59100.00%5100.00%

#define arch_atomic64_inc_not_zero(v) arch_atomic64_add_unless((v), 1, 0) /* * arch_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 arch_atomic64_dec_if_positive(atomic64_t *v) { s64 dec, c = arch_atomic64_read(v); do { dec = c - 1; if (unlikely(dec < 0)) break; } while (!arch_atomic64_try_cmpxchg(v, &c, dec)); return dec; }

Contributors

PersonTokensPropCommitsCommitProp
Luca Barbieri4375.44%125.00%
Peter Zijlstra1017.54%125.00%
Dmitriy Vyukov47.02%250.00%
Total57100.00%4100.00%


static inline void arch_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%266.67%
Peter Zijlstra211.76%133.33%
Total17100.00%3100.00%


static inline long arch_atomic64_fetch_and(long i, atomic64_t *v) { s64 val = arch_atomic64_read(v); do { } while (!arch_atomic64_try_cmpxchg(v, &val, val & i)); return val; }

Contributors

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


static inline void arch_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%266.67%
Peter Zijlstra317.65%133.33%
Total17100.00%3100.00%


static inline long arch_atomic64_fetch_or(long i, atomic64_t *v) { s64 val = arch_atomic64_read(v); do { } while (!arch_atomic64_try_cmpxchg(v, &val, val | i)); return val; }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov3888.37%360.00%
Peter Zijlstra511.63%240.00%
Total43100.00%5100.00%


static inline void arch_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%2100.00%
Total17100.00%2100.00%


static inline long arch_atomic64_fetch_xor(long i, atomic64_t *v) { s64 val = arch_atomic64_read(v); do { } while (!arch_atomic64_try_cmpxchg(v, &val, val ^ i)); return val; }

Contributors

PersonTokensPropCommitsCommitProp
Dmitriy Vyukov4093.02%360.00%
Peter Zijlstra36.98%240.00%
Total43100.00%5100.00%

#endif /* _ASM_X86_ATOMIC64_64_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Brian Gerst30239.27%15.26%
Dmitriy Vyukov21327.70%315.79%
Peter Zijlstra18023.41%631.58%
Luca Barbieri435.59%15.26%
H. Peter Anvin131.69%315.79%
Jeremy Fitzhardinge91.17%15.26%
Hagen Paul Pfeifer40.52%15.26%
Pranith Kumar20.26%15.26%
Anton Blanchard20.26%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.