cregit-Linux how code gets into the kernel

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

/* SPDX-License-Identifier: GPL-2.0 */
/*
 *  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/atomic_ops.h>
#include <asm/barrier.h>
#include <asm/processor.h>


#define SPINLOCK_LOCKVAL (S390_lowcore.spinlock_lockval)

extern int spin_retry;

#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(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 Hachtmann1885.71%125.00%
Christian Bornträger14.76%125.00%
Martin Schwidefsky14.76%125.00%
Linus Torvalds (pre-git)14.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) && __atomic_cmpxchg_bool(&lp->lock, 0, SPINLOCK_LOCKVAL)); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky2055.56%342.86%
Philipp Hachtmann1027.78%228.57%
Linus Torvalds (pre-git)513.89%114.29%
Thomas Gleixner12.78%114.29%
Total36100.00%7100.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)932.14%116.67%
Martin Schwidefsky828.57%233.33%
Philipp Hachtmann828.57%116.67%
Thomas Gleixner310.71%233.33%
Total28100.00%6100.00%


static inline void arch_spin_unlock(arch_spinlock_t *lp) { typecheck(int, lp->lock); asm volatile( #ifdef CONFIG_HAVE_MARCH_ZEC12_FEATURES " .long 0xb2fa0070\n" /* NIAI 7 */ #endif " st %1,%0\n" : "=Q" (lp->lock) : "d" (0) : "cc", "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky1651.61%337.50%
Linus Torvalds (pre-git)722.58%112.50%
Heiko Carstens412.90%112.50%
Thomas Gleixner26.45%225.00%
Philipp Hachtmann26.45%112.50%
Total31100.00%8100.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) { int old = ACCESS_ONCE(rw->lock); return likely(old >= 0 && __atomic_cmpxchg_bool(&rw->lock, old, old + 1)); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky3990.70%360.00%
Linus Torvalds (pre-git)36.98%120.00%
Thomas Gleixner12.33%120.00%
Total43100.00%5100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky41100.00%2100.00%
Total41100.00%2100.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) \ ({ \ int old_val; \ \ typecheck(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) \ ({ \ int old_val; \ \ typecheck(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, int prev);
static inline void arch_read_lock(arch_rwlock_t *rw) { int old; old = __RAW_LOCK(&rw->lock, 1, __RAW_OP_ADD); if (old < 0) _raw_read_lock_wait(rw); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky39100.00%1100.00%
Total39100.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) { 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 Schwidefsky47100.00%1100.00%
Total47100.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) { int old; do { old = ACCESS_ONCE(rw->lock); } while (!__atomic_cmpxchg_bool(&rw->lock, old, old - 1)); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky3375.00%350.00%
Philipp Hachtmann920.45%116.67%
Thomas Gleixner24.55%233.33%
Total44100.00%6100.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(int, rw->lock); rw->owner = 0; asm volatile( "st %1,%0\n" : "+Q" (rw->lock) : "d" (0) : "cc", "memory"); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky2379.31%450.00%
Heiko Carstens310.34%112.50%
Thomas Gleixner26.90%225.00%
Christian Bornträger13.45%112.50%
Total29100.00%8100.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%
Thomas Gleixner27.14%240.00%
Ingo Molnar27.14%120.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 Schwidefsky64271.18%1442.42%
Philipp Hachtmann9210.20%26.06%
Linus Torvalds (pre-git)414.55%13.03%
Christian Bornträger333.66%39.09%
Thomas Gleixner303.33%412.12%
Heiko Carstens283.10%412.12%
Hisashi Hifumi262.88%13.03%
Peter Zijlstra60.67%13.03%
Ingo Molnar30.33%26.06%
Greg Kroah-Hartman10.11%13.03%
Total902100.00%33100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.