cregit-Linux how code gets into the kernel

Release 4.10 arch/s390/include/asm/spinlock.h

/*
 *  S390 version
 *    Copyright IBM Corp. 1999
 *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
 *
 *  Derived from "include/asm-i386/spinlock.h"
 */

#ifndef __ASM_SPINLOCK_H

#define __ASM_SPINLOCK_H

#include <linux/smp.h>
#include <asm/barrier.h>
#include <asm/processor.h>


#define SPINLOCK_LOCKVAL (S390_lowcore.spinlock_lockval)

extern int spin_retry;


static inline int _raw_compare_and_swap(unsigned int *lock, unsigned int old, unsigned int new) { return __sync_bool_compare_and_swap(lock, old, new); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky30100.00%2100.00%
Total30100.00%2100.00%

#ifndef CONFIG_SMP
static inline bool arch_vcpu_is_preempted(int cpu) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
christian borntraegerchristian borntraeger13100.00%1100.00%
Total13100.00%1100.00%

#else bool arch_vcpu_is_preempted(int cpu); #endif #define vcpu_is_preempted arch_vcpu_is_preempted /* * Simple spin lock operations. There are two variants, one clears IRQ's * on the local processor, one does not. * * We make no fairness assumptions. They have a cost. * * (the type definitions are in asm/spinlock_types.h) */ void arch_lock_relax(unsigned int cpu); void arch_spin_lock_wait(arch_spinlock_t *); int arch_spin_trylock_retry(arch_spinlock_t *); void arch_spin_lock_wait_flags(arch_spinlock_t *, unsigned long flags);
static inline void arch_spin_relax(arch_spinlock_t *lock) { arch_lock_relax(lock->lock); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky18100.00%1100.00%
Total18100.00%1100.00%


static inline u32 arch_spin_lockval(int cpu) { return ~cpu; }

Contributors

PersonTokensPropCommitsCommitProp
philipp hachtmannphilipp hachtmann14100.00%1100.00%
Total14100.00%1100.00%


static inline int arch_spin_value_unlocked(arch_spinlock_t lock) { return lock.lock == 0; }

Contributors

PersonTokensPropCommitsCommitProp
heiko carstensheiko carstens1694.12%150.00%
philipp hachtmannphilipp hachtmann15.88%150.00%
Total17100.00%2100.00%


static inline int arch_spin_is_locked(arch_spinlock_t *lp) { return ACCESS_ONCE(lp->lock) != 0; }

Contributors

PersonTokensPropCommitsCommitProp
philipp hachtmannphilipp hachtmann1361.90%125.00%
pre-gitpre-git628.57%125.00%
thomas gleixnerthomas gleixner14.76%125.00%
martin schwidefskymartin schwidefsky14.76%125.00%
Total21100.00%4100.00%


static inline int arch_spin_trylock_once(arch_spinlock_t *lp) { barrier(); return likely(arch_spin_value_unlocked(*lp) && _raw_compare_and_swap(&lp->lock, 0, SPINLOCK_LOCKVAL)); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky2158.33%360.00%
philipp hachtmannphilipp hachtmann1541.67%240.00%
Total36100.00%5100.00%


static inline void arch_spin_lock(arch_spinlock_t *lp) { if (!arch_spin_trylock_once(lp)) arch_spin_lock_wait(lp); }

Contributors

PersonTokensPropCommitsCommitProp
philipp hachtmannphilipp hachtmann1562.50%120.00%
martin schwidefskymartin schwidefsky729.17%240.00%
pre-gitpre-git14.17%120.00%
thomas gleixnerthomas gleixner14.17%120.00%
Total24100.00%5100.00%


static inline void arch_spin_lock_flags(arch_spinlock_t *lp, unsigned long flags) { if (!arch_spin_trylock_once(lp)) arch_spin_lock_wait_flags(lp, flags); }

Contributors

PersonTokensPropCommitsCommitProp
hisashi hifumihisashi hifumi2273.33%125.00%
philipp hachtmannphilipp hachtmann516.67%125.00%
thomas gleixnerthomas gleixner310.00%250.00%
Total30100.00%4100.00%


static inline int arch_spin_trylock(arch_spinlock_t *lp) { if (!arch_spin_trylock_once(lp)) return arch_spin_trylock_retry(lp); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git1035.71%116.67%
philipp hachtmannphilipp hachtmann828.57%116.67%
martin schwidefskymartin schwidefsky725.00%233.33%
thomas gleixnerthomas gleixner310.71%233.33%
Total28100.00%6100.00%


static inline void arch_spin_unlock(arch_spinlock_t *lp) { typecheck(unsigned int, lp->lock); asm volatile( "st %1,%0\n" : "+Q" (lp->lock) : "d" (0) : "cc", "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git733.33%114.29%
heiko carstensheiko carstens733.33%114.29%
philipp hachtmannphilipp hachtmann29.52%114.29%
thomas gleixnerthomas gleixner29.52%228.57%
martin schwidefskymartin schwidefsky29.52%114.29%
christian borntraegerchristian borntraeger14.76%114.29%
Total21100.00%7100.00%


static inline void arch_spin_unlock_wait(arch_spinlock_t *lock) { while (arch_spin_is_locked(lock)) arch_spin_relax(lock); smp_acquire__after_ctrl_dep(); }

Contributors

PersonTokensPropCommitsCommitProp
philipp hachtmannphilipp hachtmann2076.92%125.00%
peter zijlstrapeter zijlstra311.54%125.00%
martin schwidefskymartin schwidefsky27.69%125.00%
pre-gitpre-git13.85%125.00%
Total26100.00%4100.00%

/* * Read-write spinlocks, allowing multiple readers * but only one writer. * * NOTE! it is quite common to have readers in interrupts * but no interrupt writers. For those circumstances we * can "mix" irq-safe locks - any writer needs to get a * irq-safe write-lock, but readers can get non-irqsafe * read-locks. */ /** * read_can_lock - would read_trylock() succeed? * @lock: the rwlock in question. */ #define arch_read_can_lock(x) ((int)(x)->lock >= 0) /** * write_can_lock - would write_trylock() succeed? * @lock: the rwlock in question. */ #define arch_write_can_lock(x) ((x)->lock == 0) extern int _raw_read_trylock_retry(arch_rwlock_t *lp); extern int _raw_write_trylock_retry(arch_rwlock_t *lp); #define arch_read_lock_flags(lock, flags) arch_read_lock(lock) #define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
static inline int arch_read_trylock_once(arch_rwlock_t *rw) { unsigned int old = ACCESS_ONCE(rw->lock); return likely((int) old >= 0 && _raw_compare_and_swap(&rw->lock, old, old + 1)); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky4391.49%250.00%
pre-gitpre-git36.38%125.00%
thomas gleixnerthomas gleixner12.13%125.00%
Total47100.00%4100.00%


static inline int arch_write_trylock_once(arch_rwlock_t *rw) { unsigned int old = ACCESS_ONCE(rw->lock); return likely(old == 0 && _raw_compare_and_swap(&rw->lock, 0, 0x80000000)); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky42100.00%1100.00%
Total42100.00%1100.00%

#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES #define __RAW_OP_OR "lao" #define __RAW_OP_AND "lan" #define __RAW_OP_ADD "laa" #define __RAW_LOCK(ptr, op_val, op_string) \ ({ \ unsigned int old_val; \ \ typecheck(unsigned int *, ptr); \ asm volatile( \ op_string " %0,%2,%1\n" \ "bcr 14,0\n" \ : "=d" (old_val), "+Q" (*ptr) \ : "d" (op_val) \ : "cc", "memory"); \ old_val; \ }) #define __RAW_UNLOCK(ptr, op_val, op_string) \ ({ \ unsigned int old_val; \ \ typecheck(unsigned int *, ptr); \ asm volatile( \ op_string " %0,%2,%1\n" \ : "=d" (old_val), "+Q" (*ptr) \ : "d" (op_val) \ : "cc", "memory"); \ old_val; \ }) extern void _raw_read_lock_wait(arch_rwlock_t *lp); extern void _raw_write_lock_wait(arch_rwlock_t *lp, unsigned int prev);
static inline void arch_read_lock(arch_rwlock_t *rw) { unsigned int old; old = __RAW_LOCK(&rw->lock, 1, __RAW_OP_ADD); if ((int) old < 0) _raw_read_lock_wait(rw); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky43100.00%1100.00%
Total43100.00%1100.00%


static inline void arch_read_unlock(arch_rwlock_t *rw) { __RAW_UNLOCK(&rw->lock, -1, __RAW_OP_ADD); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky24100.00%1100.00%
Total24100.00%1100.00%


static inline void arch_write_lock(arch_rwlock_t *rw) { unsigned int old; old = __RAW_LOCK(&rw->lock, 0x80000000, __RAW_OP_OR); if (old != 0) _raw_write_lock_wait(rw, old); rw->owner = SPINLOCK_LOCKVAL; }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky48100.00%1100.00%
Total48100.00%1100.00%


static inline void arch_write_unlock(arch_rwlock_t *rw) { rw->owner = 0; __RAW_UNLOCK(&rw->lock, 0x7fffffff, __RAW_OP_AND); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky29100.00%1100.00%
Total29100.00%1100.00%

#else /* CONFIG_HAVE_MARCH_Z196_FEATURES */ extern void _raw_read_lock_wait(arch_rwlock_t *lp); extern void _raw_write_lock_wait(arch_rwlock_t *lp);
static inline void arch_read_lock(arch_rwlock_t *rw) { if (!arch_read_trylock_once(rw)) _raw_read_lock_wait(rw); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky24100.00%2100.00%
Total24100.00%2100.00%


static inline void arch_read_unlock(arch_rwlock_t *rw) { unsigned int old; do { old = ACCESS_ONCE(rw->lock); } while (!_raw_compare_and_swap(&rw->lock, old, old - 1)); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky3475.56%240.00%
philipp hachtmannphilipp hachtmann920.00%120.00%
thomas gleixnerthomas gleixner24.44%240.00%
Total45100.00%5100.00%


static inline void arch_write_lock(arch_rwlock_t *rw) { if (!arch_write_trylock_once(rw)) _raw_write_lock_wait(rw); rw->owner = SPINLOCK_LOCKVAL; }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky2480.00%342.86%
pre-gitpre-git310.00%114.29%
thomas gleixnerthomas gleixner26.67%228.57%
philipp hachtmannphilipp hachtmann13.33%114.29%
Total30100.00%7100.00%


static inline void arch_write_unlock(arch_rwlock_t *rw) { typecheck(unsigned int, rw->lock); rw->owner = 0; asm volatile( "st %1,%0\n" : "+Q" (rw->lock) : "d" (0) : "cc", "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky1866.67%342.86%
heiko carstensheiko carstens622.22%114.29%
thomas gleixnerthomas gleixner27.41%228.57%
christian borntraegerchristian borntraeger13.70%114.29%
Total27100.00%7100.00%

#endif /* CONFIG_HAVE_MARCH_Z196_FEATURES */
static inline int arch_read_trylock(arch_rwlock_t *rw) { if (!arch_read_trylock_once(rw)) return _raw_read_trylock_retry(rw); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky2485.71%240.00%
ingo molnaringo molnar27.14%120.00%
thomas gleixnerthomas gleixner27.14%240.00%
Total28100.00%5100.00%


static inline int arch_write_trylock(arch_rwlock_t *rw) { if (!arch_write_trylock_once(rw) && !_raw_write_trylock_retry(rw)) return 0; rw->owner = SPINLOCK_LOCKVAL; return 1; }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky3594.59%466.67%
thomas gleixnerthomas gleixner25.41%233.33%
Total37100.00%6100.00%


static inline void arch_read_relax(arch_rwlock_t *rw) { arch_lock_relax(rw->owner); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky1794.44%266.67%
thomas gleixnerthomas gleixner15.56%133.33%
Total18100.00%3100.00%


static inline void arch_write_relax(arch_rwlock_t *rw) { arch_lock_relax(rw->owner); }

Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky1794.44%266.67%
thomas gleixnerthomas gleixner15.56%133.33%
Total18100.00%3100.00%

#endif /* __ASM_SPINLOCK_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
martin schwidefskymartin schwidefsky66469.53%1343.33%
philipp hachtmannphilipp hachtmann11211.73%26.67%
pre-gitpre-git434.50%13.33%
heiko carstensheiko carstens343.56%413.33%
christian borntraegerchristian borntraeger343.56%26.67%
thomas gleixnerthomas gleixner303.14%413.33%
hisashi hifumihisashi hifumi262.72%13.33%
peter zijlstrapeter zijlstra90.94%13.33%
ingo molnaringo molnar30.31%26.67%
Total955100.00%30100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.