cregit-Linux how code gets into the kernel

Release 4.11 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 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 Bornträger13100.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 Schwidefsky18100.00%1100.00%
Total18100.00%1100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Philipp 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 Carstens1694.12%150.00%
Philipp Hachtmann15.88%150.00%
Total17100.00%2100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Philipp Hachtmann1257.14%120.00%
Linus Torvalds (pre-git)628.57%120.00%
Thomas Gleixner14.76%120.00%
Christian Bornträger14.76%120.00%
Martin Schwidefsky14.76%120.00%
Total21100.00%5100.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 Schwidefsky2158.33%360.00%
Philipp 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 Hachtmann1562.50%120.00%
Martin Schwidefsky729.17%240.00%
Thomas Gleixner14.17%120.00%
Linus Torvalds (pre-git)14.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 Hifumi2273.33%125.00%
Philipp Hachtmann516.67%125.00%
Thomas 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
Linus Torvalds (pre-git)1035.71%116.67%
Philipp Hachtmann828.57%116.67%
Martin Schwidefsky725.00%233.33%
Thomas 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
Heiko Carstens733.33%114.29%
Linus Torvalds (pre-git)733.33%114.29%
Thomas Gleixner29.52%228.57%
Philipp Hachtmann29.52%114.29%
Martin Schwidefsky29.52%114.29%
Christian Bornträger14.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 Hachtmann2076.92%125.00%
Peter Zijlstra311.54%125.00%
Martin Schwidefsky27.69%125.00%
Linus Torvalds (pre-git)13.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 Schwidefsky4391.49%250.00%
Linus Torvalds (pre-git)36.38%125.00%
Thomas 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 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 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 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 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 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 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 Schwidefsky3475.56%240.00%
Philipp Hachtmann920.00%120.00%
Thomas 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 Schwidefsky2480.00%342.86%
Linus Torvalds (pre-git)310.00%114.29%
Thomas Gleixner26.67%228.57%
Philipp 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 Schwidefsky1866.67%342.86%
Heiko Carstens622.22%114.29%
Thomas Gleixner27.41%228.57%
Christian Bornträger13.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 Schwidefsky2485.71%240.00%
Ingo Molnar27.14%120.00%
Thomas 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 Schwidefsky3594.59%466.67%
Thomas 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 Schwidefsky1794.44%266.67%
Thomas 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 Schwidefsky1794.44%266.67%
Thomas Gleixner15.56%133.33%
Total18100.00%3100.00%

#endif /* __ASM_SPINLOCK_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky66469.53%1341.94%
Philipp Hachtmann11111.62%26.45%
Linus Torvalds (pre-git)434.50%13.23%
Christian Bornträger353.66%39.68%
Heiko Carstens343.56%412.90%
Thomas Gleixner303.14%412.90%
Hisashi Hifumi262.72%13.23%
Peter Zijlstra90.94%13.23%
Ingo Molnar30.31%26.45%
Total955100.00%31100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.