cregit-Linux how code gets into the kernel

Release 4.8 arch/x86/include/asm/mutex_64.h

/*
 * Assembly implementation of the mutex fastpath, based on atomic
 * decrement/increment.
 *
 * started by Ingo Molnar:
 *
 *  Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
 */
#ifndef _ASM_X86_MUTEX_64_H

#define _ASM_X86_MUTEX_64_H

/**
 * __mutex_fastpath_lock - decrement and call function if negative
 * @v: pointer of type atomic_t
 * @fail_fn: function to call if the result is negative
 *
 * Atomically decrements @v and calls <fail_fn> if the result is negative.
 */
#ifdef CC_HAVE_ASM_GOTO

static inline void __mutex_fastpath_lock(atomic_t *v, void (*fail_fn)(atomic_t *)) { asm_volatile_goto(LOCK_PREFIX " decl %0\n" " jns %l[exit]\n" : : "m" (v->counter) : "memory", "cc" : exit); fail_fn(v); exit: return; }

Contributors

PersonTokensPropCommitsCommitProp
wedson almeida filhowedson almeida filho3264.00%150.00%
ingo molnaringo molnar1836.00%150.00%
Total50100.00%2100.00%

#else #define __mutex_fastpath_lock(v, fail_fn) \ do { \ unsigned long dummy; \ \ typecheck(atomic_t *, v); \ typecheck_fn(void (*)(atomic_t *), fail_fn); \ \ asm volatile(LOCK_PREFIX " decl (%%rdi)\n" \ " jns 1f \n" \ " call " #fail_fn "\n" \ "1:" \ : "=D" (dummy) \ : "D" (v) \ : "rax", "rsi", "rdx", "rcx", \ "r8", "r9", "r10", "r11", "memory"); \ } while (0) #endif /** * __mutex_fastpath_lock_retval - try to take the lock by moving the count * from 1 to a 0 value * @count: pointer of type atomic_t * * Change the count from 1 to a value lower than 1. This function returns 0 * if the fastpath succeeds, or -1 otherwise. */
static inline int __mutex_fastpath_lock_retval(atomic_t *count) { if (unlikely(atomic_dec_return(count) < 0)) return -1; else return 0; }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar2683.87%250.00%
glauber de oliveira costaglauber de oliveira costa39.68%125.00%
maarten lankhorstmaarten lankhorst26.45%125.00%
Total31100.00%4100.00%

/** * __mutex_fastpath_unlock - increment and call function if nonpositive * @v: pointer of type atomic_t * @fail_fn: function to call if the result is nonpositive * * Atomically increments @v and calls <fail_fn> if the result is nonpositive. */ #ifdef CC_HAVE_ASM_GOTO
static inline void __mutex_fastpath_unlock(atomic_t *v, void (*fail_fn)(atomic_t *)) { asm_volatile_goto(LOCK_PREFIX " incl %0\n" " jg %l[exit]\n" : : "m" (v->counter) : "memory", "cc" : exit); fail_fn(v); exit: return; }

Contributors

PersonTokensPropCommitsCommitProp
wedson almeida filhowedson almeida filho3264.00%150.00%
ingo molnaringo molnar1836.00%150.00%
Total50100.00%2100.00%

#else #define __mutex_fastpath_unlock(v, fail_fn) \ do { \ unsigned long dummy; \ \ typecheck(atomic_t *, v); \ typecheck_fn(void (*)(atomic_t *), fail_fn); \ \ asm volatile(LOCK_PREFIX " incl (%%rdi)\n" \ " jg 1f\n" \ " call " #fail_fn "\n" \ "1:" \ : "=D" (dummy) \ : "D" (v) \ : "rax", "rsi", "rdx", "rcx", \ "r8", "r9", "r10", "r11", "memory"); \ } while (0) #endif #define __mutex_slowpath_needs_to_unlock() 1 /** * __mutex_fastpath_trylock - try to acquire the mutex, without waiting * * @count: pointer of type atomic_t * @fail_fn: fallback function * * Change the count from 1 to 0 and return 1 (success), or return 0 (failure) * if it wasn't 1 originally. [the fallback function is never used on * x86_64, because all x86_64 CPUs have a CMPXCHG instruction.] */
static inline int __mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *)) { if (likely(atomic_read(count) == 1 && atomic_cmpxchg(count, 1, 0) == 1)) return 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar4284.00%250.00%
peter zijlstrapeter zijlstra714.00%125.00%
linus torvaldslinus torvalds12.00%125.00%
Total50100.00%4100.00%

#endif /* _ASM_X86_MUTEX_64_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar13758.55%222.22%
wedson almeida filhowedson almeida filho7833.33%111.11%
peter zijlstrapeter zijlstra72.99%111.11%
h. peter anvinh. peter anvin31.28%111.11%
maarten lankhorstmaarten lankhorst31.28%111.11%
glauber de oliveira costaglauber de oliveira costa31.28%111.11%
joe perchesjoe perches20.85%111.11%
linus torvaldslinus torvalds10.43%111.11%
Total234100.00%9100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.