Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull core locking updates from Ingo Molnar: "The main changes in this cycle are: - Another attempt at enabling cross-release lockdep dependency tracking (automatically part of CONFIG_PROVE_LOCKING=y), this time with better performance and fewer false positives. (Byungchul Park) - Introduce lockdep_assert_irqs_enabled()/disabled() and convert open-coded equivalents to lockdep variants. (Frederic Weisbecker) - Add down_read_killable() and use it in the VFS's iterate_dir() method. (Kirill Tkhai) - Convert remaining uses of ACCESS_ONCE() to READ_ONCE()/WRITE_ONCE(). Most of the conversion was Coccinelle driven. (Mark Rutland, Paul E. McKenney) - Get rid of lockless_dereference(), by strengthening Alpha atomics, strengthening READ_ONCE() with smp_read_barrier_depends() and thus being able to convert users of lockless_dereference() to READ_ONCE(). (Will Deacon) - Various micro-optimizations: - better PV qspinlocks (Waiman Long), - better x86 barriers (Michael S. Tsirkin) - better x86 refcounts (Kees Cook) - ... plus other fixes and enhancements. (Borislav Petkov, Juergen Gross, Miguel Bernal Marin)" * 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (70 commits) locking/x86: Use LOCK ADD for smp_mb() instead of MFENCE rcu: Use lockdep to assert IRQs are disabled/enabled netpoll: Use lockdep to assert IRQs are disabled/enabled timers/posix-cpu-timers: Use lockdep to assert IRQs are disabled/enabled sched/clock, sched/cputime: Use lockdep to assert IRQs are disabled/enabled irq_work: Use lockdep to assert IRQs are disabled/enabled irq/timings: Use lockdep to assert IRQs are disabled/enabled perf/core: Use lockdep to assert IRQs are disabled/enabled x86: Use lockdep to assert IRQs are disabled/enabled smp/core: Use lockdep to assert IRQs are disabled/enabled timers/hrtimer: Use lockdep to assert IRQs are disabled/enabled timers/nohz: Use lockdep to assert IRQs are disabled/enabled workqueue: Use lockdep to assert IRQs are disabled/enabled irq/softirqs: Use lockdep to assert IRQs are disabled/enabled locking/lockdep: Add IRQs disabled/enabled assertion APIs: lockdep_assert_irqs_enabled()/disabled() locking/pvqspinlock: Implement hybrid PV queued/unfair locks locking/rwlocks: Fix comments x86/paravirt: Set up the virt_spin_lock_key after static keys get initialized block, locking/lockdep: Assign a lock_class per gendisk used for wait_for_completion() workqueue: Remove now redundant lock acquisitions wrt. workqueue flushes ...
This commit is contained in:
Коммит
8e9a2dba86
|
@ -709,6 +709,9 @@
|
|||
It will be ignored when crashkernel=X,high is not used
|
||||
or memory reserved is below 4G.
|
||||
|
||||
crossrelease_fullstack
|
||||
[KNL] Allow to record full stack trace in cross-release
|
||||
|
||||
cryptomgr.notests
|
||||
[KNL] Disable crypto self-tests
|
||||
|
||||
|
|
|
@ -826,9 +826,9 @@ If the filesystem may need to revalidate dcache entries, then
|
|||
*is* passed the dentry but does not have access to the `inode` or the
|
||||
`seq` number from the `nameidata`, so it needs to be extra careful
|
||||
when accessing fields in the dentry. This "extra care" typically
|
||||
involves using `ACCESS_ONCE()` or the newer [`READ_ONCE()`] to access
|
||||
fields, and verifying the result is not NULL before using it. This
|
||||
pattern can be see in `nfs_lookup_revalidate()`.
|
||||
involves using [`READ_ONCE()`] to access fields, and verifying the
|
||||
result is not NULL before using it. This pattern can be seen in
|
||||
`nfs_lookup_revalidate()`.
|
||||
|
||||
A pair of patterns
|
||||
------------------
|
||||
|
|
|
@ -1880,18 +1880,6 @@ There are some more advanced barrier functions:
|
|||
See Documentation/atomic_{t,bitops}.txt for more information.
|
||||
|
||||
|
||||
(*) lockless_dereference();
|
||||
|
||||
This can be thought of as a pointer-fetch wrapper around the
|
||||
smp_read_barrier_depends() data-dependency barrier.
|
||||
|
||||
This is also similar to rcu_dereference(), but in cases where
|
||||
object lifetime is handled by some mechanism other than RCU, for
|
||||
example, when the objects removed only when the system goes down.
|
||||
In addition, lockless_dereference() is used in some data structures
|
||||
that can be used both with and without RCU.
|
||||
|
||||
|
||||
(*) dma_wmb();
|
||||
(*) dma_rmb();
|
||||
|
||||
|
|
|
@ -1858,18 +1858,6 @@ Mandatory 배리어들은 SMP 시스템에서도 UP 시스템에서도 SMP 효
|
|||
참고하세요.
|
||||
|
||||
|
||||
(*) lockless_dereference();
|
||||
|
||||
이 함수는 smp_read_barrier_depends() 데이터 의존성 배리어를 사용하는
|
||||
포인터 읽어오기 래퍼(wrapper) 함수로 생각될 수 있습니다.
|
||||
|
||||
객체의 라이프타임이 RCU 외의 메커니즘으로 관리된다는 점을 제외하면
|
||||
rcu_dereference() 와도 유사한데, 예를 들면 객체가 시스템이 꺼질 때에만
|
||||
제거되는 경우 등입니다. 또한, lockless_dereference() 은 RCU 와 함께
|
||||
사용될수도, RCU 없이 사용될 수도 있는 일부 데이터 구조에 사용되고
|
||||
있습니다.
|
||||
|
||||
|
||||
(*) dma_wmb();
|
||||
(*) dma_rmb();
|
||||
|
||||
|
|
|
@ -14,6 +14,15 @@
|
|||
* than regular operations.
|
||||
*/
|
||||
|
||||
/*
|
||||
* To ensure dependency ordering is preserved for the _relaxed and
|
||||
* _release atomics, an smp_read_barrier_depends() is unconditionally
|
||||
* inserted into the _relaxed variants, which are used to build the
|
||||
* barriered versions. To avoid redundant back-to-back fences, we can
|
||||
* define the _acquire and _fence versions explicitly.
|
||||
*/
|
||||
#define __atomic_op_acquire(op, args...) op##_relaxed(args)
|
||||
#define __atomic_op_fence __atomic_op_release
|
||||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
@ -61,6 +70,7 @@ static inline int atomic_##op##_return_relaxed(int i, atomic_t *v) \
|
|||
".previous" \
|
||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result) \
|
||||
:"Ir" (i), "m" (v->counter) : "memory"); \
|
||||
smp_read_barrier_depends(); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
|
@ -78,6 +88,7 @@ static inline int atomic_fetch_##op##_relaxed(int i, atomic_t *v) \
|
|||
".previous" \
|
||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result) \
|
||||
:"Ir" (i), "m" (v->counter) : "memory"); \
|
||||
smp_read_barrier_depends(); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
|
@ -112,6 +123,7 @@ static __inline__ long atomic64_##op##_return_relaxed(long i, atomic64_t * v) \
|
|||
".previous" \
|
||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result) \
|
||||
:"Ir" (i), "m" (v->counter) : "memory"); \
|
||||
smp_read_barrier_depends(); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
|
@ -129,6 +141,7 @@ static __inline__ long atomic64_fetch_##op##_relaxed(long i, atomic64_t * v) \
|
|||
".previous" \
|
||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result) \
|
||||
:"Ir" (i), "m" (v->counter) : "memory"); \
|
||||
smp_read_barrier_depends(); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
|
||||
#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
|
||||
|
||||
static inline void __down_read(struct rw_semaphore *sem)
|
||||
static inline int ___down_read(struct rw_semaphore *sem)
|
||||
{
|
||||
long oldcount;
|
||||
#ifndef CONFIG_SMP
|
||||
|
@ -42,10 +42,24 @@ static inline void __down_read(struct rw_semaphore *sem)
|
|||
:"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
|
||||
:"Ir" (RWSEM_ACTIVE_READ_BIAS), "m" (sem->count) : "memory");
|
||||
#endif
|
||||
if (unlikely(oldcount < 0))
|
||||
return (oldcount < 0);
|
||||
}
|
||||
|
||||
static inline void __down_read(struct rw_semaphore *sem)
|
||||
{
|
||||
if (unlikely(___down_read(sem)))
|
||||
rwsem_down_read_failed(sem);
|
||||
}
|
||||
|
||||
static inline int __down_read_killable(struct rw_semaphore *sem)
|
||||
{
|
||||
if (unlikely(___down_read(sem)))
|
||||
if (IS_ERR(rwsem_down_read_failed_killable(sem)))
|
||||
return -EINTR;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* trylock for reading -- returns 1 if successful, 0 if contention
|
||||
*/
|
||||
|
@ -95,9 +109,10 @@ static inline void __down_write(struct rw_semaphore *sem)
|
|||
|
||||
static inline int __down_write_killable(struct rw_semaphore *sem)
|
||||
{
|
||||
if (unlikely(___down_write(sem)))
|
||||
if (unlikely(___down_write(sem))) {
|
||||
if (IS_ERR(rwsem_down_write_failed_killable(sem)))
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
* We make no fairness assumptions. They have a cost.
|
||||
*/
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
#define arch_spin_is_locked(x) ((x)->lock != 0)
|
||||
|
||||
static inline int arch_spin_value_unlocked(arch_spinlock_t lock)
|
||||
|
@ -55,16 +54,6 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
|||
|
||||
/***********************************************************/
|
||||
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *lock)
|
||||
{
|
||||
return (lock->lock & 1) == 0;
|
||||
}
|
||||
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *lock)
|
||||
{
|
||||
return lock->lock == 0;
|
||||
}
|
||||
|
||||
static inline void arch_read_lock(arch_rwlock_t *lock)
|
||||
{
|
||||
long regx;
|
||||
|
@ -171,7 +160,4 @@ static inline void arch_write_unlock(arch_rwlock_t * lock)
|
|||
lock->lock = 0;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#endif /* _ALPHA_SPINLOCK_H */
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <asm/barrier.h>
|
||||
|
||||
#define arch_spin_is_locked(x) ((x)->slock != __ARCH_SPIN_LOCK_UNLOCKED__)
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
#ifdef CONFIG_ARC_HAS_LLSC
|
||||
|
||||
|
@ -410,14 +409,4 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
|||
|
||||
#endif
|
||||
|
||||
#define arch_read_can_lock(x) ((x)->counter > 0)
|
||||
#define arch_write_can_lock(x) ((x)->counter == __ARCH_RW_LOCK_UNLOCKED__)
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* __ASM_SPINLOCK_H */
|
||||
|
|
|
@ -250,7 +250,7 @@ static void ipi_send_msg_one(int cpu, enum ipi_msg_type msg)
|
|||
* and read back old value
|
||||
*/
|
||||
do {
|
||||
new = old = ACCESS_ONCE(*ipi_data_ptr);
|
||||
new = old = READ_ONCE(*ipi_data_ptr);
|
||||
new |= 1U << msg;
|
||||
} while (cmpxchg(ipi_data_ptr, old, new) != old);
|
||||
|
||||
|
|
|
@ -126,8 +126,7 @@ extern unsigned long profile_pc(struct pt_regs *regs);
|
|||
/*
|
||||
* kprobe-based event tracer support
|
||||
*/
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
#define MAX_REG_OFFSET (offsetof(struct pt_regs, ARM_ORIG_r0))
|
||||
|
||||
extern int regs_query_register_offset(const char *name);
|
||||
|
|
|
@ -53,8 +53,6 @@ static inline void dsb_sev(void)
|
|||
* memory.
|
||||
*/
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
static inline void arch_spin_lock(arch_spinlock_t *lock)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
@ -74,7 +72,7 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||
|
||||
while (lockval.tickets.next != lockval.tickets.owner) {
|
||||
wfe();
|
||||
lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner);
|
||||
lockval.tickets.owner = READ_ONCE(lock->tickets.owner);
|
||||
}
|
||||
|
||||
smp_mb();
|
||||
|
@ -194,9 +192,6 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
|||
dsb_sev();
|
||||
}
|
||||
|
||||
/* write_can_lock - would write_trylock() succeed? */
|
||||
#define arch_write_can_lock(x) (ACCESS_ONCE((x)->lock) == 0)
|
||||
|
||||
/*
|
||||
* Read locks are a bit more hairy:
|
||||
* - Exclusively load the lock value.
|
||||
|
@ -274,14 +269,4 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
|
|||
}
|
||||
}
|
||||
|
||||
/* read_can_lock - would read_trylock() succeed? */
|
||||
#define arch_read_can_lock(x) (ACCESS_ONCE((x)->lock) < 0x80000000)
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* __ASM_SPINLOCK_H */
|
||||
|
|
|
@ -179,7 +179,7 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
|
|||
bool entered_lp2 = false;
|
||||
|
||||
if (tegra_pending_sgi())
|
||||
ACCESS_ONCE(abort_flag) = true;
|
||||
WRITE_ONCE(abort_flag, true);
|
||||
|
||||
cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ static notrace u32 __vdso_read_begin(const struct vdso_data *vdata)
|
|||
{
|
||||
u32 seq;
|
||||
repeat:
|
||||
seq = ACCESS_ONCE(vdata->seq_count);
|
||||
seq = READ_ONCE(vdata->seq_count);
|
||||
if (seq & 1) {
|
||||
cpu_relax();
|
||||
goto repeat;
|
||||
|
|
|
@ -22,7 +22,24 @@ config ARM64
|
|||
select ARCH_HAS_STRICT_MODULE_RWX
|
||||
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG if ACPI_APEI_SEA
|
||||
select ARCH_INLINE_READ_LOCK if !PREEMPT
|
||||
select ARCH_INLINE_READ_LOCK_BH if !PREEMPT
|
||||
select ARCH_INLINE_READ_LOCK_IRQ if !PREEMPT
|
||||
select ARCH_INLINE_READ_LOCK_IRQSAVE if !PREEMPT
|
||||
select ARCH_INLINE_READ_UNLOCK if !PREEMPT
|
||||
select ARCH_INLINE_READ_UNLOCK_BH if !PREEMPT
|
||||
select ARCH_INLINE_READ_UNLOCK_IRQ if !PREEMPT
|
||||
select ARCH_INLINE_READ_UNLOCK_IRQRESTORE if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_LOCK if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_LOCK_BH if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_LOCK_IRQ if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_LOCK_IRQSAVE if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_UNLOCK if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_UNLOCK_BH if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQ if !PREEMPT
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE if !PREEMPT
|
||||
select ARCH_USE_CMPXCHG_LOCKREF
|
||||
select ARCH_USE_QUEUED_RWLOCKS
|
||||
select ARCH_SUPPORTS_MEMORY_FAILURE
|
||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||
|
|
|
@ -16,6 +16,7 @@ generic-y += mcs_spinlock.h
|
|||
generic-y += mm-arch-hooks.h
|
||||
generic-y += msi.h
|
||||
generic-y += preempt.h
|
||||
generic-y += qrwlock.h
|
||||
generic-y += rwsem.h
|
||||
generic-y += segment.h
|
||||
generic-y += serial.h
|
||||
|
|
|
@ -27,8 +27,6 @@
|
|||
* instructions.
|
||||
*/
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
static inline void arch_spin_lock(arch_spinlock_t *lock)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
@ -139,176 +137,7 @@ static inline int arch_spin_is_contended(arch_spinlock_t *lock)
|
|||
}
|
||||
#define arch_spin_is_contended arch_spin_is_contended
|
||||
|
||||
/*
|
||||
* Write lock implementation.
|
||||
*
|
||||
* Write locks set bit 31. Unlocking, is done by writing 0 since the lock is
|
||||
* exclusively held.
|
||||
*
|
||||
* The memory barriers are implicit with the load-acquire and store-release
|
||||
* instructions.
|
||||
*/
|
||||
|
||||
static inline void arch_write_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
asm volatile(ARM64_LSE_ATOMIC_INSN(
|
||||
/* LL/SC */
|
||||
" sevl\n"
|
||||
"1: wfe\n"
|
||||
"2: ldaxr %w0, %1\n"
|
||||
" cbnz %w0, 1b\n"
|
||||
" stxr %w0, %w2, %1\n"
|
||||
" cbnz %w0, 2b\n"
|
||||
__nops(1),
|
||||
/* LSE atomics */
|
||||
"1: mov %w0, wzr\n"
|
||||
"2: casa %w0, %w2, %1\n"
|
||||
" cbz %w0, 3f\n"
|
||||
" ldxr %w0, %1\n"
|
||||
" cbz %w0, 2b\n"
|
||||
" wfe\n"
|
||||
" b 1b\n"
|
||||
"3:")
|
||||
: "=&r" (tmp), "+Q" (rw->lock)
|
||||
: "r" (0x80000000)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
static inline int arch_write_trylock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
asm volatile(ARM64_LSE_ATOMIC_INSN(
|
||||
/* LL/SC */
|
||||
"1: ldaxr %w0, %1\n"
|
||||
" cbnz %w0, 2f\n"
|
||||
" stxr %w0, %w2, %1\n"
|
||||
" cbnz %w0, 1b\n"
|
||||
"2:",
|
||||
/* LSE atomics */
|
||||
" mov %w0, wzr\n"
|
||||
" casa %w0, %w2, %1\n"
|
||||
__nops(2))
|
||||
: "=&r" (tmp), "+Q" (rw->lock)
|
||||
: "r" (0x80000000)
|
||||
: "memory");
|
||||
|
||||
return !tmp;
|
||||
}
|
||||
|
||||
static inline void arch_write_unlock(arch_rwlock_t *rw)
|
||||
{
|
||||
asm volatile(ARM64_LSE_ATOMIC_INSN(
|
||||
" stlr wzr, %0",
|
||||
" swpl wzr, wzr, %0")
|
||||
: "=Q" (rw->lock) :: "memory");
|
||||
}
|
||||
|
||||
/* write_can_lock - would write_trylock() succeed? */
|
||||
#define arch_write_can_lock(x) ((x)->lock == 0)
|
||||
|
||||
/*
|
||||
* Read lock implementation.
|
||||
*
|
||||
* It exclusively loads the lock value, increments it and stores the new value
|
||||
* back if positive and the CPU still exclusively owns the location. If the
|
||||
* value is negative, the lock is already held.
|
||||
*
|
||||
* During unlocking there may be multiple active read locks but no write lock.
|
||||
*
|
||||
* The memory barriers are implicit with the load-acquire and store-release
|
||||
* instructions.
|
||||
*
|
||||
* Note that in UNDEFINED cases, such as unlocking a lock twice, the LL/SC
|
||||
* and LSE implementations may exhibit different behaviour (although this
|
||||
* will have no effect on lockdep).
|
||||
*/
|
||||
static inline void arch_read_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int tmp, tmp2;
|
||||
|
||||
asm volatile(
|
||||
" sevl\n"
|
||||
ARM64_LSE_ATOMIC_INSN(
|
||||
/* LL/SC */
|
||||
"1: wfe\n"
|
||||
"2: ldaxr %w0, %2\n"
|
||||
" add %w0, %w0, #1\n"
|
||||
" tbnz %w0, #31, 1b\n"
|
||||
" stxr %w1, %w0, %2\n"
|
||||
" cbnz %w1, 2b\n"
|
||||
__nops(1),
|
||||
/* LSE atomics */
|
||||
"1: wfe\n"
|
||||
"2: ldxr %w0, %2\n"
|
||||
" adds %w1, %w0, #1\n"
|
||||
" tbnz %w1, #31, 1b\n"
|
||||
" casa %w0, %w1, %2\n"
|
||||
" sbc %w0, %w1, %w0\n"
|
||||
" cbnz %w0, 2b")
|
||||
: "=&r" (tmp), "=&r" (tmp2), "+Q" (rw->lock)
|
||||
:
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static inline void arch_read_unlock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int tmp, tmp2;
|
||||
|
||||
asm volatile(ARM64_LSE_ATOMIC_INSN(
|
||||
/* LL/SC */
|
||||
"1: ldxr %w0, %2\n"
|
||||
" sub %w0, %w0, #1\n"
|
||||
" stlxr %w1, %w0, %2\n"
|
||||
" cbnz %w1, 1b",
|
||||
/* LSE atomics */
|
||||
" movn %w0, #0\n"
|
||||
" staddl %w0, %2\n"
|
||||
__nops(2))
|
||||
: "=&r" (tmp), "=&r" (tmp2), "+Q" (rw->lock)
|
||||
:
|
||||
: "memory");
|
||||
}
|
||||
|
||||
static inline int arch_read_trylock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int tmp, tmp2;
|
||||
|
||||
asm volatile(ARM64_LSE_ATOMIC_INSN(
|
||||
/* LL/SC */
|
||||
" mov %w1, #1\n"
|
||||
"1: ldaxr %w0, %2\n"
|
||||
" add %w0, %w0, #1\n"
|
||||
" tbnz %w0, #31, 2f\n"
|
||||
" stxr %w1, %w0, %2\n"
|
||||
" cbnz %w1, 1b\n"
|
||||
"2:",
|
||||
/* LSE atomics */
|
||||
" ldr %w0, %2\n"
|
||||
" adds %w1, %w0, #1\n"
|
||||
" tbnz %w1, #31, 1f\n"
|
||||
" casa %w0, %w1, %2\n"
|
||||
" sbc %w1, %w1, %w0\n"
|
||||
__nops(1)
|
||||
"1:")
|
||||
: "=&r" (tmp), "=&r" (tmp2), "+Q" (rw->lock)
|
||||
:
|
||||
: "cc", "memory");
|
||||
|
||||
return !tmp2;
|
||||
}
|
||||
|
||||
/* read_can_lock - would read_trylock() succeed? */
|
||||
#define arch_read_can_lock(x) ((x)->lock < 0x80000000)
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
#include <asm/qrwlock.h>
|
||||
|
||||
/* See include/linux/spinlock.h */
|
||||
#define smp_mb__after_spinlock() smp_mb()
|
||||
|
|
|
@ -36,10 +36,6 @@ typedef struct {
|
|||
|
||||
#define __ARCH_SPIN_LOCK_UNLOCKED { 0 , 0 }
|
||||
|
||||
typedef struct {
|
||||
volatile unsigned int lock;
|
||||
} arch_rwlock_t;
|
||||
|
||||
#define __ARCH_RW_LOCK_UNLOCKED { 0 }
|
||||
#include <asm-generic/qrwlock_types.h>
|
||||
|
||||
#endif
|
||||
|
|
|
@ -36,8 +36,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||
__raw_spin_lock_asm(&lock->lock);
|
||||
}
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
||||
{
|
||||
return __raw_spin_trylock_asm(&lock->lock);
|
||||
|
@ -48,23 +46,11 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||
__raw_spin_unlock_asm(&lock->lock);
|
||||
}
|
||||
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
return __raw_uncached_fetch_asm(&rw->lock) > 0;
|
||||
}
|
||||
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
return __raw_uncached_fetch_asm(&rw->lock) == RW_LOCK_BIAS;
|
||||
}
|
||||
|
||||
static inline void arch_read_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
__raw_read_lock_asm(&rw->lock);
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
|
||||
static inline int arch_read_trylock(arch_rwlock_t *rw)
|
||||
{
|
||||
return __raw_read_trylock_asm(&rw->lock);
|
||||
|
@ -80,8 +66,6 @@ static inline void arch_write_lock(arch_rwlock_t *rw)
|
|||
__raw_write_lock_asm(&rw->lock);
|
||||
}
|
||||
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
static inline int arch_write_trylock(arch_rwlock_t *rw)
|
||||
{
|
||||
return __raw_write_trylock_asm(&rw->lock);
|
||||
|
@ -92,10 +76,6 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
|||
__raw_write_unlock_asm(&rw->lock);
|
||||
}
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* !__BFIN_SPINLOCK_H */
|
||||
|
|
|
@ -86,16 +86,6 @@ static inline int arch_read_trylock(arch_rwlock_t *lock)
|
|||
return temp;
|
||||
}
|
||||
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *rwlock)
|
||||
{
|
||||
return rwlock->lock == 0;
|
||||
}
|
||||
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *rwlock)
|
||||
{
|
||||
return rwlock->lock == 0;
|
||||
}
|
||||
|
||||
/* Stuffs a -1 in the lock value? */
|
||||
static inline void arch_write_lock(arch_rwlock_t *lock)
|
||||
{
|
||||
|
@ -177,11 +167,6 @@ static inline unsigned int arch_spin_trylock(arch_spinlock_t *lock)
|
|||
/*
|
||||
* SMP spinlocks are intended to allow only a single CPU at the lock
|
||||
*/
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
#define arch_spin_is_locked(x) ((x)->lock != 0)
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -38,15 +38,31 @@
|
|||
/*
|
||||
* lock for reading
|
||||
*/
|
||||
static inline void
|
||||
__down_read (struct rw_semaphore *sem)
|
||||
static inline int
|
||||
___down_read (struct rw_semaphore *sem)
|
||||
{
|
||||
long result = ia64_fetchadd8_acq((unsigned long *)&sem->count.counter, 1);
|
||||
|
||||
if (result < 0)
|
||||
return (result < 0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
__down_read (struct rw_semaphore *sem)
|
||||
{
|
||||
if (___down_read(sem))
|
||||
rwsem_down_read_failed(sem);
|
||||
}
|
||||
|
||||
static inline int
|
||||
__down_read_killable (struct rw_semaphore *sem)
|
||||
{
|
||||
if (___down_read(sem))
|
||||
if (IS_ERR(rwsem_down_read_failed_killable(sem)))
|
||||
return -EINTR;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* lock for writing
|
||||
*/
|
||||
|
@ -73,9 +89,10 @@ __down_write (struct rw_semaphore *sem)
|
|||
static inline int
|
||||
__down_write_killable (struct rw_semaphore *sem)
|
||||
{
|
||||
if (___down_write(sem))
|
||||
if (___down_write(sem)) {
|
||||
if (IS_ERR(rwsem_down_write_failed_killable(sem)))
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -62,7 +62,7 @@ static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
|
|||
|
||||
static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
|
||||
{
|
||||
int tmp = ACCESS_ONCE(lock->lock);
|
||||
int tmp = READ_ONCE(lock->lock);
|
||||
|
||||
if (!(((tmp >> TICKET_SHIFT) ^ tmp) & TICKET_MASK))
|
||||
return ia64_cmpxchg(acq, &lock->lock, tmp, tmp + 1, sizeof (tmp)) == tmp;
|
||||
|
@ -74,19 +74,19 @@ static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
|
|||
unsigned short *p = (unsigned short *)&lock->lock + 1, tmp;
|
||||
|
||||
asm volatile ("ld2.bias %0=[%1]" : "=r"(tmp) : "r"(p));
|
||||
ACCESS_ONCE(*p) = (tmp + 2) & ~1;
|
||||
WRITE_ONCE(*p, (tmp + 2) & ~1);
|
||||
}
|
||||
|
||||
static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
|
||||
{
|
||||
long tmp = ACCESS_ONCE(lock->lock);
|
||||
long tmp = READ_ONCE(lock->lock);
|
||||
|
||||
return !!(((tmp >> TICKET_SHIFT) ^ tmp) & TICKET_MASK);
|
||||
}
|
||||
|
||||
static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
|
||||
{
|
||||
long tmp = ACCESS_ONCE(lock->lock);
|
||||
long tmp = READ_ONCE(lock->lock);
|
||||
|
||||
return ((tmp - (tmp >> TICKET_SHIFT)) & TICKET_MASK) > 1;
|
||||
}
|
||||
|
@ -127,9 +127,7 @@ static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
|
|||
{
|
||||
arch_spin_lock(lock);
|
||||
}
|
||||
|
||||
#define arch_read_can_lock(rw) (*(volatile int *)(rw) >= 0)
|
||||
#define arch_write_can_lock(rw) (*(volatile int *)(rw) == 0)
|
||||
#define arch_spin_lock_flags arch_spin_lock_flags
|
||||
|
||||
#ifdef ASM_SUPPORTED
|
||||
|
||||
|
@ -157,6 +155,7 @@ arch_read_lock_flags(arch_rwlock_t *lock, unsigned long flags)
|
|||
: "p6", "p7", "r2", "memory");
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags arch_read_lock_flags
|
||||
#define arch_read_lock(lock) arch_read_lock_flags(lock, 0)
|
||||
|
||||
#else /* !ASM_SUPPORTED */
|
||||
|
@ -209,6 +208,7 @@ arch_write_lock_flags(arch_rwlock_t *lock, unsigned long flags)
|
|||
: "ar.ccv", "p6", "p7", "r2", "r29", "memory");
|
||||
}
|
||||
|
||||
#define arch_write_lock_flags arch_write_lock_flags
|
||||
#define arch_write_lock(rw) arch_write_lock_flags(rw, 0)
|
||||
|
||||
#define arch_write_trylock(rw) \
|
||||
|
@ -232,8 +232,6 @@ static inline void arch_write_unlock(arch_rwlock_t *x)
|
|||
|
||||
#else /* !ASM_SUPPORTED */
|
||||
|
||||
#define arch_write_lock_flags(l, flags) arch_write_lock(l)
|
||||
|
||||
#define arch_write_lock(l) \
|
||||
({ \
|
||||
__u64 ia64_val, ia64_set_val = ia64_dep_mi(-1, 0, 31, 1); \
|
||||
|
@ -273,8 +271,4 @@ static inline int arch_read_trylock(arch_rwlock_t *x)
|
|||
return (u32)ia64_cmpxchg4_acq((__u32 *)(x), new.word, old.word) == old.word;
|
||||
}
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* _ASM_IA64_SPINLOCK_H */
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
*/
|
||||
|
||||
#define arch_spin_is_locked(x) (*(volatile int *)(&(x)->slock) <= 0)
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
/**
|
||||
* arch_spin_trylock - Try spin lock and return a result
|
||||
|
@ -138,18 +137,6 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||
* semaphore.h for details. -ben
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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 == RW_LOCK_BIAS)
|
||||
|
||||
static inline void arch_read_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned long tmp0, tmp1;
|
||||
|
@ -318,11 +305,4 @@ static inline int arch_write_trylock(arch_rwlock_t *lock)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* _ASM_M32R_SPINLOCK_H */
|
||||
|
|
|
@ -16,13 +16,4 @@
|
|||
* locked.
|
||||
*/
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* __ASM_SPINLOCK_H */
|
||||
|
|
|
@ -137,21 +137,6 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
/* write_can_lock - would write_trylock() succeed? */
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
int ret;
|
||||
|
||||
asm volatile ("LNKGETD %0, [%1]\n"
|
||||
"CMP %0, #0\n"
|
||||
"MOV %0, #1\n"
|
||||
"XORNZ %0, %0, %0\n"
|
||||
: "=&d" (ret)
|
||||
: "da" (&rw->lock)
|
||||
: "cc");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read locks are a bit more hairy:
|
||||
* - Exclusively load the lock value.
|
||||
|
@ -225,26 +210,4 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
|
|||
return tmp;
|
||||
}
|
||||
|
||||
/* read_can_lock - would read_trylock() succeed? */
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
int tmp;
|
||||
|
||||
asm volatile ("LNKGETD %0, [%1]\n"
|
||||
"CMP %0, %2\n"
|
||||
"MOV %0, #1\n"
|
||||
"XORZ %0, %0, %0\n"
|
||||
: "=&d" (tmp)
|
||||
: "da" (&rw->lock), "bd" (0x80000000)
|
||||
: "cc");
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* __ASM_SPINLOCK_LNKGET_H */
|
||||
|
|
|
@ -105,16 +105,6 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
|||
rw->lock = 0;
|
||||
}
|
||||
|
||||
/* write_can_lock - would write_trylock() succeed? */
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
barrier();
|
||||
ret = rw->lock;
|
||||
return (ret == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read locks are a bit more hairy:
|
||||
* - Exclusively load the lock value.
|
||||
|
@ -172,14 +162,4 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
|
|||
return (ret < 0x80000000);
|
||||
}
|
||||
|
||||
/* read_can_lock - would read_trylock() succeed? */
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
barrier();
|
||||
ret = rw->lock;
|
||||
return (ret < 0x80000000);
|
||||
}
|
||||
|
||||
#endif /* __ASM_SPINLOCK_LOCK1_H */
|
||||
|
|
|
@ -13,11 +13,4 @@
|
|||
#include <asm/qrwlock.h>
|
||||
#include <asm/qspinlock.h>
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* _ASM_SPINLOCK_H */
|
||||
|
|
|
@ -99,7 +99,7 @@ static inline u32 vdso_data_read_begin(const union mips_vdso_data *data)
|
|||
u32 seq;
|
||||
|
||||
while (true) {
|
||||
seq = ACCESS_ONCE(data->seq_count);
|
||||
seq = READ_ONCE(data->seq_count);
|
||||
if (likely(!(seq & 1))) {
|
||||
/* Paired with smp_wmb() in vdso_data_write_*(). */
|
||||
smp_rmb();
|
||||
|
|
|
@ -166,7 +166,7 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
|||
nc_core_ready_count = nc_addr;
|
||||
|
||||
/* Ensure ready_count is zero-initialised before the assembly runs */
|
||||
ACCESS_ONCE(*nc_core_ready_count) = 0;
|
||||
WRITE_ONCE(*nc_core_ready_count, 0);
|
||||
coupled_barrier(&per_cpu(pm_barrier, core), online);
|
||||
|
||||
/* Run the generated entry code */
|
||||
|
|
|
@ -84,6 +84,7 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *lock,
|
|||
: "d" (flags), "a"(&lock->slock), "i"(EPSW_IE | MN10300_CLI_LEVEL)
|
||||
: "memory", "cc");
|
||||
}
|
||||
#define arch_spin_lock_flags arch_spin_lock_flags
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -98,18 +99,6 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *lock,
|
|||
* 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 == RW_LOCK_BIAS)
|
||||
|
||||
/*
|
||||
* On mn10300, we implement read-write locks as a 32-bit counter
|
||||
* with the high bit (sign) being the "contended" bit.
|
||||
|
@ -183,9 +172,6 @@ static inline int arch_write_trylock(arch_rwlock_t *lock)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define _raw_spin_relax(lock) cpu_relax()
|
||||
#define _raw_read_relax(lock) cpu_relax()
|
||||
#define _raw_write_relax(lock) cpu_relax()
|
||||
|
|
|
@ -543,7 +543,7 @@ static void mn10300_serial_receive_interrupt(struct mn10300_serial_port *port)
|
|||
|
||||
try_again:
|
||||
/* pull chars out of the hat */
|
||||
ix = ACCESS_ONCE(port->rx_outp);
|
||||
ix = READ_ONCE(port->rx_outp);
|
||||
if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) {
|
||||
if (push && !tport->low_latency)
|
||||
tty_flip_buffer_push(tport);
|
||||
|
@ -1724,7 +1724,7 @@ static int mn10300_serial_poll_get_char(struct uart_port *_port)
|
|||
if (mn10300_serial_int_tbl[port->rx_irq].port != NULL) {
|
||||
do {
|
||||
/* pull chars out of the hat */
|
||||
ix = ACCESS_ONCE(port->rx_outp);
|
||||
ix = READ_ONCE(port->rx_outp);
|
||||
if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0)
|
||||
return NO_POLL_CHAR;
|
||||
|
||||
|
|
|
@ -261,7 +261,7 @@ atomic64_set(atomic64_t *v, s64 i)
|
|||
static __inline__ s64
|
||||
atomic64_read(const atomic64_t *v)
|
||||
{
|
||||
return ACCESS_ONCE((v)->counter);
|
||||
return READ_ONCE((v)->counter);
|
||||
}
|
||||
|
||||
#define atomic64_inc(v) (atomic64_add( 1,(v)))
|
||||
|
|
|
@ -32,6 +32,7 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *x,
|
|||
cpu_relax();
|
||||
mb();
|
||||
}
|
||||
#define arch_spin_lock_flags arch_spin_lock_flags
|
||||
|
||||
static inline void arch_spin_unlock(arch_spinlock_t *x)
|
||||
{
|
||||
|
@ -169,25 +170,4 @@ static __inline__ int arch_write_trylock(arch_rwlock_t *rw)
|
|||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* read_can_lock - would read_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
static __inline__ int arch_read_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
return rw->counter >= 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* write_can_lock - would write_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
static __inline__ int arch_write_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
return !rw->counter;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#endif /* __ASM_SPINLOCK_H */
|
||||
|
|
|
@ -161,6 +161,7 @@ void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)
|
|||
local_irq_restore(flags_dis);
|
||||
}
|
||||
}
|
||||
#define arch_spin_lock_flags arch_spin_lock_flags
|
||||
|
||||
static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
||||
{
|
||||
|
@ -181,9 +182,6 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||
* read-locks.
|
||||
*/
|
||||
|
||||
#define arch_read_can_lock(rw) ((rw)->lock >= 0)
|
||||
#define arch_write_can_lock(rw) (!(rw)->lock)
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#define __DO_SIGN_EXTEND "extsw %0,%0\n"
|
||||
#define WRLOCK_TOKEN LOCK_TOKEN /* it's negative */
|
||||
|
@ -302,9 +300,6 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
|||
rw->lock = 0;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) __spin_yield(lock)
|
||||
#define arch_read_relax(lock) __rw_yield(lock)
|
||||
#define arch_write_relax(lock) __rw_yield(lock)
|
||||
|
|
|
@ -78,7 +78,7 @@ static unsigned long lock_rtas(void)
|
|||
|
||||
local_irq_save(flags);
|
||||
preempt_disable();
|
||||
arch_spin_lock_flags(&rtas.lock, flags);
|
||||
arch_spin_lock(&rtas.lock);
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ ssize_t opal_msglog_copy(char *to, loff_t pos, size_t count)
|
|||
if (!opal_memcons)
|
||||
return -ENODEV;
|
||||
|
||||
out_pos = be32_to_cpu(ACCESS_ONCE(opal_memcons->out_pos));
|
||||
out_pos = be32_to_cpu(READ_ONCE(opal_memcons->out_pos));
|
||||
|
||||
/* Now we've read out_pos, put a barrier in before reading the new
|
||||
* data it points to in conbuf. */
|
||||
|
|
|
@ -38,6 +38,7 @@ bool arch_vcpu_is_preempted(int cpu);
|
|||
*/
|
||||
|
||||
void arch_spin_relax(arch_spinlock_t *lock);
|
||||
#define arch_spin_relax arch_spin_relax
|
||||
|
||||
void arch_spin_lock_wait(arch_spinlock_t *);
|
||||
int arch_spin_trylock_retry(arch_spinlock_t *);
|
||||
|
@ -76,6 +77,7 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *lp,
|
|||
if (!arch_spin_trylock_once(lp))
|
||||
arch_spin_lock_wait(lp);
|
||||
}
|
||||
#define arch_spin_lock_flags arch_spin_lock_flags
|
||||
|
||||
static inline int arch_spin_trylock(arch_spinlock_t *lp)
|
||||
{
|
||||
|
@ -105,20 +107,6 @@ static inline void arch_spin_unlock(arch_spinlock_t *lp)
|
|||
* read-locks.
|
||||
*/
|
||||
|
||||
/**
|
||||
* read_can_lock - would read_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
#define arch_read_can_lock(x) (((x)->cnts & 0xffff0000) == 0)
|
||||
|
||||
/**
|
||||
* write_can_lock - would write_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
#define arch_write_can_lock(x) ((x)->cnts == 0)
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
#define arch_read_relax(rw) barrier()
|
||||
#define arch_write_relax(rw) barrier()
|
||||
|
||||
|
|
|
@ -215,7 +215,7 @@ static inline void arch_spin_lock_classic(arch_spinlock_t *lp)
|
|||
lockval = SPINLOCK_LOCKVAL; /* cpu + 1 */
|
||||
|
||||
/* Pass the virtual CPU to the lock holder if it is not running */
|
||||
owner = arch_spin_yield_target(ACCESS_ONCE(lp->lock), NULL);
|
||||
owner = arch_spin_yield_target(READ_ONCE(lp->lock), NULL);
|
||||
if (owner && arch_vcpu_is_preempted(owner - 1))
|
||||
smp_yield_cpu(owner - 1);
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ static inline unsigned __sl_cas(volatile unsigned *p, unsigned old, unsigned new
|
|||
*/
|
||||
|
||||
#define arch_spin_is_locked(x) ((x)->lock <= 0)
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
static inline void arch_spin_lock(arch_spinlock_t *lock)
|
||||
{
|
||||
|
@ -53,18 +52,6 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
|||
* read-locks.
|
||||
*/
|
||||
|
||||
/**
|
||||
* read_can_lock - would read_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
#define arch_read_can_lock(x) ((x)->lock > 0)
|
||||
|
||||
/**
|
||||
* write_can_lock - would write_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
#define arch_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS)
|
||||
|
||||
static inline void arch_read_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned old;
|
||||
|
@ -102,11 +89,4 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)
|
|||
return __sl_cas(&rw->lock, RW_LOCK_BIAS, 0) == RW_LOCK_BIAS;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* __ASM_SH_SPINLOCK_CAS_H */
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
*/
|
||||
|
||||
#define arch_spin_is_locked(x) ((x)->lock <= 0)
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
/*
|
||||
* Simple spin lock operations. There are two variants, one clears IRQ's
|
||||
|
@ -89,18 +88,6 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
|||
* read-locks.
|
||||
*/
|
||||
|
||||
/**
|
||||
* read_can_lock - would read_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
#define arch_read_can_lock(x) ((x)->lock > 0)
|
||||
|
||||
/**
|
||||
* write_can_lock - would write_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
#define arch_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS)
|
||||
|
||||
static inline void arch_read_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
@ -209,11 +196,4 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)
|
|||
return (oldval > (RW_LOCK_BIAS - 1));
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* __ASM_SH_SPINLOCK_LLSC_H */
|
||||
|
|
|
@ -32,7 +32,7 @@ void atomic_set(atomic_t *, int);
|
|||
|
||||
#define atomic_set_release(v, i) atomic_set((v), (i))
|
||||
|
||||
#define atomic_read(v) ACCESS_ONCE((v)->counter)
|
||||
#define atomic_read(v) READ_ONCE((v)->counter)
|
||||
|
||||
#define atomic_add(i, v) ((void)atomic_add_return( (int)(i), (v)))
|
||||
#define atomic_sub(i, v) ((void)atomic_add_return(-(int)(i), (v)))
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#if defined(__sparc__) && defined(__arch64__)
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/threads.h>
|
||||
#include <asm/switch_to.h>
|
||||
|
||||
|
|
|
@ -183,17 +183,6 @@ static inline int __arch_read_trylock(arch_rwlock_t *rw)
|
|||
res; \
|
||||
})
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
#define arch_read_lock_flags(rw, flags) arch_read_lock(rw)
|
||||
#define arch_write_lock_flags(rw, flags) arch_write_lock(rw)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#define arch_read_can_lock(rw) (!((rw)->lock & 0xff))
|
||||
#define arch_write_can_lock(rw) (!(rw)->lock)
|
||||
|
||||
#endif /* !(__ASSEMBLY__) */
|
||||
|
||||
#endif /* __SPARC_SPINLOCK_H */
|
||||
|
|
|
@ -14,13 +14,6 @@
|
|||
#include <asm/qrwlock.h>
|
||||
#include <asm/qspinlock.h>
|
||||
|
||||
#define arch_read_lock_flags(p, f) arch_read_lock(p)
|
||||
#define arch_write_lock_flags(p, f) arch_write_lock(p)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* !(__ASSEMBLY__) */
|
||||
|
||||
#endif /* !(__SPARC64_SPINLOCK_H) */
|
||||
|
|
|
@ -163,14 +163,14 @@ int __gxio_dma_queue_is_complete(__gxio_dma_queue_t *dma_queue,
|
|||
int64_t completion_slot, int update)
|
||||
{
|
||||
if (update) {
|
||||
if (ACCESS_ONCE(dma_queue->hw_complete_count) >
|
||||
if (READ_ONCE(dma_queue->hw_complete_count) >
|
||||
completion_slot)
|
||||
return 1;
|
||||
|
||||
__gxio_dma_queue_update_credits(dma_queue);
|
||||
}
|
||||
|
||||
return ACCESS_ONCE(dma_queue->hw_complete_count) > completion_slot;
|
||||
return READ_ONCE(dma_queue->hw_complete_count) > completion_slot;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(__gxio_dma_queue_is_complete);
|
||||
|
|
|
@ -51,9 +51,6 @@ static inline int arch_spin_is_locked(arch_spinlock_t *lock)
|
|||
|
||||
void arch_spin_lock(arch_spinlock_t *lock);
|
||||
|
||||
/* We cannot take an interrupt after getting a ticket, so don't enable them. */
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
int arch_spin_trylock(arch_spinlock_t *lock);
|
||||
|
||||
static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
||||
|
@ -79,22 +76,6 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||
#define _RD_COUNT_SHIFT 24
|
||||
#define _RD_COUNT_WIDTH 8
|
||||
|
||||
/**
|
||||
* arch_read_can_lock() - would read_trylock() succeed?
|
||||
*/
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *rwlock)
|
||||
{
|
||||
return (rwlock->lock << _RD_COUNT_WIDTH) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_write_can_lock() - would write_trylock() succeed?
|
||||
*/
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *rwlock)
|
||||
{
|
||||
return rwlock->lock == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_read_lock() - acquire a read lock.
|
||||
*/
|
||||
|
@ -125,7 +106,4 @@ void arch_read_unlock(arch_rwlock_t *rwlock);
|
|||
*/
|
||||
void arch_write_unlock(arch_rwlock_t *rwlock);
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#endif /* _ASM_TILE_SPINLOCK_32_H */
|
||||
|
|
|
@ -75,9 +75,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||
/* Try to get the lock, and return whether we succeeded. */
|
||||
int arch_spin_trylock(arch_spinlock_t *lock);
|
||||
|
||||
/* We cannot take an interrupt after getting a ticket, so don't enable them. */
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
/*
|
||||
* Read-write spinlocks, allowing multiple readers
|
||||
* but only one writer.
|
||||
|
@ -93,24 +90,6 @@ static inline int arch_write_val_locked(int val)
|
|||
return val < 0; /* Optimize "val & __WRITE_LOCK_BIT". */
|
||||
}
|
||||
|
||||
/**
|
||||
* read_can_lock - would read_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
static inline int arch_read_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
return !arch_write_val_locked(rw->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* write_can_lock - would write_trylock() succeed?
|
||||
* @lock: the rwlock in question.
|
||||
*/
|
||||
static inline int arch_write_can_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
return rw->lock == 0;
|
||||
}
|
||||
|
||||
extern void __read_lock_failed(arch_rwlock_t *rw);
|
||||
|
||||
static inline void arch_read_lock(arch_rwlock_t *rw)
|
||||
|
@ -156,7 +135,4 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#endif /* _ASM_TILE_SPINLOCK_64_H */
|
||||
|
|
|
@ -121,7 +121,7 @@ static inline int64_t __gxio_dma_queue_reserve(__gxio_dma_queue_t *dma_queue,
|
|||
* if the result is LESS than "hw_complete_count".
|
||||
*/
|
||||
uint64_t complete;
|
||||
complete = ACCESS_ONCE(dma_queue->hw_complete_count);
|
||||
complete = READ_ONCE(dma_queue->hw_complete_count);
|
||||
slot |= (complete & 0xffffffffff000000);
|
||||
if (slot < complete)
|
||||
slot += 0x1000000;
|
||||
|
|
|
@ -255,7 +255,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
|||
|
||||
int do_syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
u32 work = ACCESS_ONCE(current_thread_info()->flags);
|
||||
u32 work = READ_ONCE(current_thread_info()->flags);
|
||||
|
||||
if ((work & _TIF_SYSCALL_TRACE) &&
|
||||
tracehook_report_syscall_entry(regs)) {
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
typedef int (*initcall_t)(void);
|
||||
typedef void (*exitcall_t)(void);
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/compiler_types.h>
|
||||
|
||||
/* These are for everybody (although not all archs will actually
|
||||
discard it in modules) */
|
||||
|
|
|
@ -56,7 +56,7 @@ config X86
|
|||
select ARCH_HAS_KCOV if X86_64
|
||||
select ARCH_HAS_PMEM_API if X86_64
|
||||
# Causing hangs/crashes, see the commit that added this change for details.
|
||||
select ARCH_HAS_REFCOUNT if BROKEN
|
||||
select ARCH_HAS_REFCOUNT
|
||||
select ARCH_HAS_UACCESS_FLUSHCACHE if X86_64
|
||||
select ARCH_HAS_SET_MEMORY
|
||||
select ARCH_HAS_SG_CHAIN
|
||||
|
|
|
@ -75,7 +75,7 @@ static long syscall_trace_enter(struct pt_regs *regs)
|
|||
if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
|
||||
BUG_ON(regs != task_pt_regs(current));
|
||||
|
||||
work = ACCESS_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY;
|
||||
work = READ_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY;
|
||||
|
||||
if (unlikely(work & _TIF_SYSCALL_EMU))
|
||||
emulated = true;
|
||||
|
@ -186,9 +186,7 @@ __visible inline void prepare_exit_to_usermode(struct pt_regs *regs)
|
|||
|
||||
addr_limit_user_check();
|
||||
|
||||
if (IS_ENABLED(CONFIG_PROVE_LOCKING) && WARN_ON(!irqs_disabled()))
|
||||
local_irq_disable();
|
||||
|
||||
lockdep_assert_irqs_disabled();
|
||||
lockdep_sys_exit();
|
||||
|
||||
cached_flags = READ_ONCE(ti->flags);
|
||||
|
|
|
@ -318,7 +318,7 @@ int gettimeofday(struct timeval *, struct timezone *)
|
|||
notrace time_t __vdso_time(time_t *t)
|
||||
{
|
||||
/* This is atomic on x86 so we don't need any locks. */
|
||||
time_t result = ACCESS_ONCE(gtod->wall_time_sec);
|
||||
time_t result = READ_ONCE(gtod->wall_time_sec);
|
||||
|
||||
if (t)
|
||||
*t = result;
|
||||
|
|
|
@ -2118,7 +2118,7 @@ static int x86_pmu_event_init(struct perf_event *event)
|
|||
event->destroy(event);
|
||||
}
|
||||
|
||||
if (ACCESS_ONCE(x86_pmu.attr_rdpmc))
|
||||
if (READ_ONCE(x86_pmu.attr_rdpmc))
|
||||
event->hw.flags |= PERF_X86_EVENT_RDPMC_ALLOWED;
|
||||
|
||||
return err;
|
||||
|
@ -2371,7 +2371,7 @@ static unsigned long get_segment_base(unsigned int segment)
|
|||
struct ldt_struct *ldt;
|
||||
|
||||
/* IRQs are off, so this synchronizes with smp_store_release */
|
||||
ldt = lockless_dereference(current->active_mm->context.ldt);
|
||||
ldt = READ_ONCE(current->active_mm->context.ldt);
|
||||
if (!ldt || idx >= ldt->nr_entries)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -12,11 +12,11 @@
|
|||
*/
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#define mb() asm volatile(ALTERNATIVE("lock; addl $0,0(%%esp)", "mfence", \
|
||||
#define mb() asm volatile(ALTERNATIVE("lock; addl $0,-4(%%esp)", "mfence", \
|
||||
X86_FEATURE_XMM2) ::: "memory", "cc")
|
||||
#define rmb() asm volatile(ALTERNATIVE("lock; addl $0,0(%%esp)", "lfence", \
|
||||
#define rmb() asm volatile(ALTERNATIVE("lock; addl $0,-4(%%esp)", "lfence", \
|
||||
X86_FEATURE_XMM2) ::: "memory", "cc")
|
||||
#define wmb() asm volatile(ALTERNATIVE("lock; addl $0,0(%%esp)", "sfence", \
|
||||
#define wmb() asm volatile(ALTERNATIVE("lock; addl $0,-4(%%esp)", "sfence", \
|
||||
X86_FEATURE_XMM2) ::: "memory", "cc")
|
||||
#else
|
||||
#define mb() asm volatile("mfence":::"memory")
|
||||
|
@ -31,7 +31,11 @@
|
|||
#endif
|
||||
#define dma_wmb() barrier()
|
||||
|
||||
#define __smp_mb() mb()
|
||||
#ifdef CONFIG_X86_32
|
||||
#define __smp_mb() asm volatile("lock; addl $0,-4(%%esp)" ::: "memory", "cc")
|
||||
#else
|
||||
#define __smp_mb() asm volatile("lock; addl $0,-4(%%rsp)" ::: "memory", "cc")
|
||||
#endif
|
||||
#define __smp_rmb() dma_rmb()
|
||||
#define __smp_wmb() barrier()
|
||||
#define __smp_store_mb(var, value) do { (void)xchg(&var, value); } while (0)
|
||||
|
|
|
@ -73,8 +73,8 @@ static inline void load_mm_ldt(struct mm_struct *mm)
|
|||
#ifdef CONFIG_MODIFY_LDT_SYSCALL
|
||||
struct ldt_struct *ldt;
|
||||
|
||||
/* lockless_dereference synchronizes with smp_store_release */
|
||||
ldt = lockless_dereference(mm->context.ldt);
|
||||
/* READ_ONCE synchronizes with smp_store_release */
|
||||
ldt = READ_ONCE(mm->context.ldt);
|
||||
|
||||
/*
|
||||
* Any change to mm->context.ldt is followed by an IPI to all
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#ifndef _ASM_X86_QSPINLOCK_H
|
||||
#define _ASM_X86_QSPINLOCK_H
|
||||
|
||||
#include <linux/jump_label.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm-generic/qspinlock_types.h>
|
||||
#include <asm/paravirt.h>
|
||||
|
@ -47,10 +48,14 @@ static inline void queued_spin_unlock(struct qspinlock *lock)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
DECLARE_STATIC_KEY_TRUE(virt_spin_lock_key);
|
||||
|
||||
void native_pv_lock_init(void) __init;
|
||||
|
||||
#define virt_spin_lock virt_spin_lock
|
||||
static inline bool virt_spin_lock(struct qspinlock *lock)
|
||||
{
|
||||
if (!static_cpu_has(X86_FEATURE_HYPERVISOR))
|
||||
if (!static_branch_likely(&virt_spin_lock_key))
|
||||
return false;
|
||||
|
||||
/*
|
||||
|
@ -66,6 +71,10 @@ static inline bool virt_spin_lock(struct qspinlock *lock)
|
|||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static inline void native_pv_lock_init(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PARAVIRT */
|
||||
|
||||
#include <asm-generic/qspinlock.h>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
* back to the regular execution flow in .text.
|
||||
*/
|
||||
#define _REFCOUNT_EXCEPTION \
|
||||
".pushsection .text.unlikely\n" \
|
||||
".pushsection .text..refcount\n" \
|
||||
"111:\tlea %[counter], %%" _ASM_CX "\n" \
|
||||
"112:\t" ASM_UD0 "\n" \
|
||||
ASM_UNREACHABLE \
|
||||
|
|
|
@ -61,18 +61,33 @@
|
|||
/*
|
||||
* lock for reading
|
||||
*/
|
||||
#define ____down_read(sem, slow_path) \
|
||||
({ \
|
||||
struct rw_semaphore* ret; \
|
||||
asm volatile("# beginning down_read\n\t" \
|
||||
LOCK_PREFIX _ASM_INC "(%[sem])\n\t" \
|
||||
/* adds 0x00000001 */ \
|
||||
" jns 1f\n" \
|
||||
" call " slow_path "\n" \
|
||||
"1:\n\t" \
|
||||
"# ending down_read\n\t" \
|
||||
: "+m" (sem->count), "=a" (ret), \
|
||||
ASM_CALL_CONSTRAINT \
|
||||
: [sem] "a" (sem) \
|
||||
: "memory", "cc"); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
static inline void __down_read(struct rw_semaphore *sem)
|
||||
{
|
||||
asm volatile("# beginning down_read\n\t"
|
||||
LOCK_PREFIX _ASM_INC "(%1)\n\t"
|
||||
/* adds 0x00000001 */
|
||||
" jns 1f\n"
|
||||
" call call_rwsem_down_read_failed\n"
|
||||
"1:\n\t"
|
||||
"# ending down_read\n\t"
|
||||
: "+m" (sem->count)
|
||||
: "a" (sem)
|
||||
: "memory", "cc");
|
||||
____down_read(sem, "call_rwsem_down_read_failed");
|
||||
}
|
||||
|
||||
static inline int __down_read_killable(struct rw_semaphore *sem)
|
||||
{
|
||||
if (IS_ERR(____down_read(sem, "call_rwsem_down_read_failed_killable")))
|
||||
return -EINTR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -82,17 +97,18 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
|
|||
{
|
||||
long result, tmp;
|
||||
asm volatile("# beginning __down_read_trylock\n\t"
|
||||
" mov %0,%1\n\t"
|
||||
" mov %[count],%[result]\n\t"
|
||||
"1:\n\t"
|
||||
" mov %1,%2\n\t"
|
||||
" add %3,%2\n\t"
|
||||
" mov %[result],%[tmp]\n\t"
|
||||
" add %[inc],%[tmp]\n\t"
|
||||
" jle 2f\n\t"
|
||||
LOCK_PREFIX " cmpxchg %2,%0\n\t"
|
||||
LOCK_PREFIX " cmpxchg %[tmp],%[count]\n\t"
|
||||
" jnz 1b\n\t"
|
||||
"2:\n\t"
|
||||
"# ending __down_read_trylock\n\t"
|
||||
: "+m" (sem->count), "=&a" (result), "=&r" (tmp)
|
||||
: "i" (RWSEM_ACTIVE_READ_BIAS)
|
||||
: [count] "+m" (sem->count), [result] "=&a" (result),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [inc] "i" (RWSEM_ACTIVE_READ_BIAS)
|
||||
: "memory", "cc");
|
||||
return result >= 0;
|
||||
}
|
||||
|
@ -106,7 +122,7 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
|
|||
struct rw_semaphore* ret; \
|
||||
\
|
||||
asm volatile("# beginning down_write\n\t" \
|
||||
LOCK_PREFIX " xadd %1,(%4)\n\t" \
|
||||
LOCK_PREFIX " xadd %[tmp],(%[sem])\n\t" \
|
||||
/* adds 0xffff0001, returns the old value */ \
|
||||
" test " __ASM_SEL(%w1,%k1) "," __ASM_SEL(%w1,%k1) "\n\t" \
|
||||
/* was the active mask 0 before? */\
|
||||
|
@ -114,9 +130,9 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
|
|||
" call " slow_path "\n" \
|
||||
"1:\n" \
|
||||
"# ending down_write" \
|
||||
: "+m" (sem->count), "=d" (tmp), \
|
||||
: "+m" (sem->count), [tmp] "=d" (tmp), \
|
||||
"=a" (ret), ASM_CALL_CONSTRAINT \
|
||||
: "a" (sem), "1" (RWSEM_ACTIVE_WRITE_BIAS) \
|
||||
: [sem] "a" (sem), "[tmp]" (RWSEM_ACTIVE_WRITE_BIAS) \
|
||||
: "memory", "cc"); \
|
||||
ret; \
|
||||
})
|
||||
|
@ -142,21 +158,21 @@ static inline bool __down_write_trylock(struct rw_semaphore *sem)
|
|||
bool result;
|
||||
long tmp0, tmp1;
|
||||
asm volatile("# beginning __down_write_trylock\n\t"
|
||||
" mov %0,%1\n\t"
|
||||
" mov %[count],%[tmp0]\n\t"
|
||||
"1:\n\t"
|
||||
" test " __ASM_SEL(%w1,%k1) "," __ASM_SEL(%w1,%k1) "\n\t"
|
||||
/* was the active mask 0 before? */
|
||||
" jnz 2f\n\t"
|
||||
" mov %1,%2\n\t"
|
||||
" add %4,%2\n\t"
|
||||
LOCK_PREFIX " cmpxchg %2,%0\n\t"
|
||||
" mov %[tmp0],%[tmp1]\n\t"
|
||||
" add %[inc],%[tmp1]\n\t"
|
||||
LOCK_PREFIX " cmpxchg %[tmp1],%[count]\n\t"
|
||||
" jnz 1b\n\t"
|
||||
"2:\n\t"
|
||||
CC_SET(e)
|
||||
"# ending __down_write_trylock\n\t"
|
||||
: "+m" (sem->count), "=&a" (tmp0), "=&r" (tmp1),
|
||||
CC_OUT(e) (result)
|
||||
: "er" (RWSEM_ACTIVE_WRITE_BIAS)
|
||||
: [count] "+m" (sem->count), [tmp0] "=&a" (tmp0),
|
||||
[tmp1] "=&r" (tmp1), CC_OUT(e) (result)
|
||||
: [inc] "er" (RWSEM_ACTIVE_WRITE_BIAS)
|
||||
: "memory");
|
||||
return result;
|
||||
}
|
||||
|
@ -168,14 +184,14 @@ static inline void __up_read(struct rw_semaphore *sem)
|
|||
{
|
||||
long tmp;
|
||||
asm volatile("# beginning __up_read\n\t"
|
||||
LOCK_PREFIX " xadd %1,(%2)\n\t"
|
||||
LOCK_PREFIX " xadd %[tmp],(%[sem])\n\t"
|
||||
/* subtracts 1, returns the old value */
|
||||
" jns 1f\n\t"
|
||||
" call call_rwsem_wake\n" /* expects old value in %edx */
|
||||
"1:\n"
|
||||
"# ending __up_read\n"
|
||||
: "+m" (sem->count), "=d" (tmp)
|
||||
: "a" (sem), "1" (-RWSEM_ACTIVE_READ_BIAS)
|
||||
: "+m" (sem->count), [tmp] "=d" (tmp)
|
||||
: [sem] "a" (sem), "[tmp]" (-RWSEM_ACTIVE_READ_BIAS)
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
|
@ -186,14 +202,14 @@ static inline void __up_write(struct rw_semaphore *sem)
|
|||
{
|
||||
long tmp;
|
||||
asm volatile("# beginning __up_write\n\t"
|
||||
LOCK_PREFIX " xadd %1,(%2)\n\t"
|
||||
LOCK_PREFIX " xadd %[tmp],(%[sem])\n\t"
|
||||
/* subtracts 0xffff0001, returns the old value */
|
||||
" jns 1f\n\t"
|
||||
" call call_rwsem_wake\n" /* expects old value in %edx */
|
||||
"1:\n\t"
|
||||
"# ending __up_write\n"
|
||||
: "+m" (sem->count), "=d" (tmp)
|
||||
: "a" (sem), "1" (-RWSEM_ACTIVE_WRITE_BIAS)
|
||||
: "+m" (sem->count), [tmp] "=d" (tmp)
|
||||
: [sem] "a" (sem), "[tmp]" (-RWSEM_ACTIVE_WRITE_BIAS)
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
|
@ -203,7 +219,7 @@ static inline void __up_write(struct rw_semaphore *sem)
|
|||
static inline void __downgrade_write(struct rw_semaphore *sem)
|
||||
{
|
||||
asm volatile("# beginning __downgrade_write\n\t"
|
||||
LOCK_PREFIX _ASM_ADD "%2,(%1)\n\t"
|
||||
LOCK_PREFIX _ASM_ADD "%[inc],(%[sem])\n\t"
|
||||
/*
|
||||
* transitions 0xZZZZ0001 -> 0xYYYY0001 (i386)
|
||||
* 0xZZZZZZZZ00000001 -> 0xYYYYYYYY00000001 (x86_64)
|
||||
|
@ -213,7 +229,7 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
|
|||
"1:\n\t"
|
||||
"# ending __downgrade_write\n"
|
||||
: "+m" (sem->count)
|
||||
: "a" (sem), "er" (-RWSEM_WAITING_BIAS)
|
||||
: [sem] "a" (sem), [inc] "er" (-RWSEM_WAITING_BIAS)
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
|
|
|
@ -42,11 +42,4 @@
|
|||
|
||||
#include <asm/qrwlock.h>
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#define arch_spin_relax(lock) cpu_relax()
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
#endif /* _ASM_X86_SPINLOCK_H */
|
||||
|
|
|
@ -49,7 +49,7 @@ static inline unsigned gtod_read_begin(const struct vsyscall_gtod_data *s)
|
|||
unsigned ret;
|
||||
|
||||
repeat:
|
||||
ret = ACCESS_ONCE(s->seq);
|
||||
ret = READ_ONCE(s->seq);
|
||||
if (unlikely(ret & 1)) {
|
||||
cpu_relax();
|
||||
goto repeat;
|
||||
|
|
|
@ -155,14 +155,14 @@ void init_espfix_ap(int cpu)
|
|||
page = cpu/ESPFIX_STACKS_PER_PAGE;
|
||||
|
||||
/* Did another CPU already set this up? */
|
||||
stack_page = ACCESS_ONCE(espfix_pages[page]);
|
||||
stack_page = READ_ONCE(espfix_pages[page]);
|
||||
if (likely(stack_page))
|
||||
goto done;
|
||||
|
||||
mutex_lock(&espfix_init_mutex);
|
||||
|
||||
/* Did we race on the lock? */
|
||||
stack_page = ACCESS_ONCE(espfix_pages[page]);
|
||||
stack_page = READ_ONCE(espfix_pages[page]);
|
||||
if (stack_page)
|
||||
goto unlock_done;
|
||||
|
||||
|
@ -200,7 +200,7 @@ void init_espfix_ap(int cpu)
|
|||
set_pte(&pte_p[n*PTE_STRIDE], pte);
|
||||
|
||||
/* Job is done for this CPU and any CPU which shares this page */
|
||||
ACCESS_ONCE(espfix_pages[page]) = stack_page;
|
||||
WRITE_ONCE(espfix_pages[page], stack_page);
|
||||
|
||||
unlock_done:
|
||||
mutex_unlock(&espfix_init_mutex);
|
||||
|
|
|
@ -102,7 +102,7 @@ static void finalize_ldt_struct(struct ldt_struct *ldt)
|
|||
static void install_ldt(struct mm_struct *current_mm,
|
||||
struct ldt_struct *ldt)
|
||||
{
|
||||
/* Synchronizes with lockless_dereference in load_mm_ldt. */
|
||||
/* Synchronizes with READ_ONCE in load_mm_ldt. */
|
||||
smp_store_release(¤t_mm->context.ldt, ldt);
|
||||
|
||||
/* Activate the LDT for all CPUs using current_mm. */
|
||||
|
|
|
@ -105,7 +105,7 @@ static void nmi_max_handler(struct irq_work *w)
|
|||
{
|
||||
struct nmiaction *a = container_of(w, struct nmiaction, irq_work);
|
||||
int remainder_ns, decimal_msecs;
|
||||
u64 whole_msecs = ACCESS_ONCE(a->max_duration);
|
||||
u64 whole_msecs = READ_ONCE(a->max_duration);
|
||||
|
||||
remainder_ns = do_div(whole_msecs, (1000 * 1000));
|
||||
decimal_msecs = remainder_ns / 1000;
|
||||
|
|
|
@ -115,8 +115,18 @@ unsigned paravirt_patch_jmp(void *insnbuf, const void *target,
|
|||
return 5;
|
||||
}
|
||||
|
||||
/* Neat trick to map patch type back to the call within the
|
||||
* corresponding structure. */
|
||||
DEFINE_STATIC_KEY_TRUE(virt_spin_lock_key);
|
||||
|
||||
void __init native_pv_lock_init(void)
|
||||
{
|
||||
if (!static_cpu_has(X86_FEATURE_HYPERVISOR))
|
||||
static_branch_disable(&virt_spin_lock_key);
|
||||
}
|
||||
|
||||
/*
|
||||
* Neat trick to map patch type back to the call within the
|
||||
* corresponding structure.
|
||||
*/
|
||||
static void *get_call_destination(u8 type)
|
||||
{
|
||||
struct paravirt_patch_template tmpl = {
|
||||
|
|
|
@ -77,6 +77,7 @@
|
|||
#include <asm/i8259.h>
|
||||
#include <asm/realmode.h>
|
||||
#include <asm/misc.h>
|
||||
#include <asm/qspinlock.h>
|
||||
|
||||
/* Number of siblings per CPU package */
|
||||
int smp_num_siblings = 1;
|
||||
|
@ -1095,7 +1096,7 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle)
|
|||
unsigned long flags;
|
||||
int err, ret = 0;
|
||||
|
||||
WARN_ON(irqs_disabled());
|
||||
lockdep_assert_irqs_enabled();
|
||||
|
||||
pr_debug("++++++++++++++++++++=_---CPU UP %u\n", cpu);
|
||||
|
||||
|
@ -1358,6 +1359,8 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
|||
pr_info("CPU0: ");
|
||||
print_cpu_info(&cpu_data(0));
|
||||
|
||||
native_pv_lock_init();
|
||||
|
||||
uv_system_init();
|
||||
|
||||
set_mtrr_aps_delayed_init();
|
||||
|
|
|
@ -443,7 +443,7 @@ static u64 __update_clear_spte_slow(u64 *sptep, u64 spte)
|
|||
|
||||
static u64 __get_spte_lockless(u64 *sptep)
|
||||
{
|
||||
return ACCESS_ONCE(*sptep);
|
||||
return READ_ONCE(*sptep);
|
||||
}
|
||||
#else
|
||||
union split_spte {
|
||||
|
@ -4819,7 +4819,7 @@ static void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
|
|||
* If we don't have indirect shadow pages, it means no page is
|
||||
* write-protected, so we can exit simply.
|
||||
*/
|
||||
if (!ACCESS_ONCE(vcpu->kvm->arch.indirect_shadow_pages))
|
||||
if (!READ_ONCE(vcpu->kvm->arch.indirect_shadow_pages))
|
||||
return;
|
||||
|
||||
remote_flush = local_flush = false;
|
||||
|
|
|
@ -157,7 +157,7 @@ bool kvm_page_track_is_active(struct kvm_vcpu *vcpu, gfn_t gfn,
|
|||
return false;
|
||||
|
||||
index = gfn_to_index(gfn, slot->base_gfn, PT_PAGE_TABLE_LEVEL);
|
||||
return !!ACCESS_ONCE(slot->arch.gfn_track[mode][index]);
|
||||
return !!READ_ONCE(slot->arch.gfn_track[mode][index]);
|
||||
}
|
||||
|
||||
void kvm_page_track_cleanup(struct kvm *kvm)
|
||||
|
|
|
@ -98,6 +98,18 @@ ENTRY(call_rwsem_down_read_failed)
|
|||
ret
|
||||
ENDPROC(call_rwsem_down_read_failed)
|
||||
|
||||
ENTRY(call_rwsem_down_read_failed_killable)
|
||||
FRAME_BEGIN
|
||||
save_common_regs
|
||||
__ASM_SIZE(push,) %__ASM_REG(dx)
|
||||
movq %rax,%rdi
|
||||
call rwsem_down_read_failed_killable
|
||||
__ASM_SIZE(pop,) %__ASM_REG(dx)
|
||||
restore_common_regs
|
||||
FRAME_END
|
||||
ret
|
||||
ENDPROC(call_rwsem_down_read_failed_killable)
|
||||
|
||||
ENTRY(call_rwsem_down_write_failed)
|
||||
FRAME_BEGIN
|
||||
save_common_regs
|
||||
|
|
|
@ -67,12 +67,17 @@ bool ex_handler_refcount(const struct exception_table_entry *fixup,
|
|||
* wrapped around) will be set. Additionally, seeing the refcount
|
||||
* reach 0 will set ZF (Zero Flag: result was zero). In each of
|
||||
* these cases we want a report, since it's a boundary condition.
|
||||
*
|
||||
* The SF case is not reported since it indicates post-boundary
|
||||
* manipulations below zero or above INT_MAX. And if none of the
|
||||
* flags are set, something has gone very wrong, so report it.
|
||||
*/
|
||||
if (regs->flags & (X86_EFLAGS_OF | X86_EFLAGS_ZF)) {
|
||||
bool zero = regs->flags & X86_EFLAGS_ZF;
|
||||
|
||||
refcount_error_report(regs, zero ? "hit zero" : "overflow");
|
||||
} else if ((regs->flags & X86_EFLAGS_SF) == 0) {
|
||||
/* Report if none of OF, ZF, nor SF are set. */
|
||||
refcount_error_report(regs, "unexpected saturation");
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -547,7 +547,7 @@ int xen_alloc_p2m_entry(unsigned long pfn)
|
|||
if (p2m_top_mfn && pfn < MAX_P2M_PFN) {
|
||||
topidx = p2m_top_index(pfn);
|
||||
top_mfn_p = &p2m_top_mfn[topidx];
|
||||
mid_mfn = ACCESS_ONCE(p2m_top_mfn_p[topidx]);
|
||||
mid_mfn = READ_ONCE(p2m_top_mfn_p[topidx]);
|
||||
|
||||
BUG_ON(virt_to_mfn(mid_mfn) != *top_mfn_p);
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/paravirt.h>
|
||||
#include <asm/qspinlock.h>
|
||||
|
||||
#include <xen/interface/xen.h>
|
||||
#include <xen/events.h>
|
||||
|
@ -81,8 +82,11 @@ void xen_init_lock_cpu(int cpu)
|
|||
int irq;
|
||||
char *name;
|
||||
|
||||
if (!xen_pvspin)
|
||||
if (!xen_pvspin) {
|
||||
if (cpu == 0)
|
||||
static_branch_disable(&virt_spin_lock_key);
|
||||
return;
|
||||
}
|
||||
|
||||
WARN(per_cpu(lock_kicker_irq, cpu) >= 0, "spinlock on CPU%d exists on IRQ%d!\n",
|
||||
cpu, per_cpu(lock_kicker_irq, cpu));
|
||||
|
|
|
@ -33,8 +33,6 @@
|
|||
|
||||
#define arch_spin_is_locked(x) ((x)->slock != 0)
|
||||
|
||||
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||
|
||||
static inline void arch_spin_lock(arch_spinlock_t *lock)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
@ -97,8 +95,6 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||
* 0x80000000 one writer owns the rwlock, no other writers, no readers
|
||||
*/
|
||||
|
||||
#define arch_write_can_lock(x) ((x)->lock == 0)
|
||||
|
||||
static inline void arch_write_lock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
@ -200,7 +196,4 @@ static inline void arch_read_unlock(arch_rwlock_t *rw)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||
|
||||
#endif /* _XTENSA_SPINLOCK_H */
|
||||
|
|
|
@ -34,23 +34,23 @@
|
|||
static void lcd_put_byte(u8 *addr, u8 data)
|
||||
{
|
||||
#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS
|
||||
ACCESS_ONCE(*addr) = data;
|
||||
WRITE_ONCE(*addr, data);
|
||||
#else
|
||||
ACCESS_ONCE(*addr) = data & 0xf0;
|
||||
ACCESS_ONCE(*addr) = (data << 4) & 0xf0;
|
||||
WRITE_ONCE(*addr, data & 0xf0);
|
||||
WRITE_ONCE(*addr, (data << 4) & 0xf0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __init lcd_init(void)
|
||||
{
|
||||
ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
|
||||
WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE8BIT);
|
||||
mdelay(5);
|
||||
ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
|
||||
WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE8BIT);
|
||||
udelay(200);
|
||||
ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
|
||||
WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE8BIT);
|
||||
udelay(50);
|
||||
#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS
|
||||
ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE4BIT;
|
||||
WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT);
|
||||
udelay(50);
|
||||
lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT);
|
||||
udelay(50);
|
||||
|
|
19
block/bio.c
19
block/bio.c
|
@ -917,17 +917,9 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(bio_iov_iter_get_pages);
|
||||
|
||||
struct submit_bio_ret {
|
||||
struct completion event;
|
||||
int error;
|
||||
};
|
||||
|
||||
static void submit_bio_wait_endio(struct bio *bio)
|
||||
{
|
||||
struct submit_bio_ret *ret = bio->bi_private;
|
||||
|
||||
ret->error = blk_status_to_errno(bio->bi_status);
|
||||
complete(&ret->event);
|
||||
complete(bio->bi_private);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -943,16 +935,15 @@ static void submit_bio_wait_endio(struct bio *bio)
|
|||
*/
|
||||
int submit_bio_wait(struct bio *bio)
|
||||
{
|
||||
struct submit_bio_ret ret;
|
||||
DECLARE_COMPLETION_ONSTACK_MAP(done, bio->bi_disk->lockdep_map);
|
||||
|
||||
init_completion(&ret.event);
|
||||
bio->bi_private = &ret;
|
||||
bio->bi_private = &done;
|
||||
bio->bi_end_io = submit_bio_wait_endio;
|
||||
bio->bi_opf |= REQ_SYNC;
|
||||
submit_bio(bio);
|
||||
wait_for_completion_io(&ret.event);
|
||||
wait_for_completion_io(&done);
|
||||
|
||||
return ret.error;
|
||||
return blk_status_to_errno(bio->bi_status);
|
||||
}
|
||||
EXPORT_SYMBOL(submit_bio_wait);
|
||||
|
||||
|
|
|
@ -261,7 +261,7 @@ static inline bool stat_sample_valid(struct blk_rq_stat *stat)
|
|||
|
||||
static u64 rwb_sync_issue_lat(struct rq_wb *rwb)
|
||||
{
|
||||
u64 now, issue = ACCESS_ONCE(rwb->sync_issue);
|
||||
u64 now, issue = READ_ONCE(rwb->sync_issue);
|
||||
|
||||
if (!issue || !rwb->sync_cookie)
|
||||
return 0;
|
||||
|
|
|
@ -1354,13 +1354,7 @@ dev_t blk_lookup_devt(const char *name, int partno)
|
|||
}
|
||||
EXPORT_SYMBOL(blk_lookup_devt);
|
||||
|
||||
struct gendisk *alloc_disk(int minors)
|
||||
{
|
||||
return alloc_disk_node(minors, NUMA_NO_NODE);
|
||||
}
|
||||
EXPORT_SYMBOL(alloc_disk);
|
||||
|
||||
struct gendisk *alloc_disk_node(int minors, int node_id)
|
||||
struct gendisk *__alloc_disk_node(int minors, int node_id)
|
||||
{
|
||||
struct gendisk *disk;
|
||||
struct disk_part_tbl *ptbl;
|
||||
|
@ -1411,7 +1405,7 @@ struct gendisk *alloc_disk_node(int minors, int node_id)
|
|||
}
|
||||
return disk;
|
||||
}
|
||||
EXPORT_SYMBOL(alloc_disk_node);
|
||||
EXPORT_SYMBOL(__alloc_disk_node);
|
||||
|
||||
struct kobject *get_disk(struct gendisk *disk)
|
||||
{
|
||||
|
|
|
@ -668,7 +668,7 @@ const char *dev_driver_string(const struct device *dev)
|
|||
* so be careful about accessing it. dev->bus and dev->class should
|
||||
* never change once they are set, so they don't need special care.
|
||||
*/
|
||||
drv = ACCESS_ONCE(dev->driver);
|
||||
drv = READ_ONCE(dev->driver);
|
||||
return drv ? drv->name :
|
||||
(dev->bus ? dev->bus->name :
|
||||
(dev->class ? dev->class->name : ""));
|
||||
|
|
|
@ -134,11 +134,11 @@ unsigned long pm_runtime_autosuspend_expiration(struct device *dev)
|
|||
if (!dev->power.use_autosuspend)
|
||||
goto out;
|
||||
|
||||
autosuspend_delay = ACCESS_ONCE(dev->power.autosuspend_delay);
|
||||
autosuspend_delay = READ_ONCE(dev->power.autosuspend_delay);
|
||||
if (autosuspend_delay < 0)
|
||||
goto out;
|
||||
|
||||
last_busy = ACCESS_ONCE(dev->power.last_busy);
|
||||
last_busy = READ_ONCE(dev->power.last_busy);
|
||||
elapsed = jiffies - last_busy;
|
||||
if (elapsed < 0)
|
||||
goto out; /* jiffies has wrapped around. */
|
||||
|
|
|
@ -641,7 +641,7 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits)
|
|||
return;
|
||||
|
||||
retry:
|
||||
entropy_count = orig = ACCESS_ONCE(r->entropy_count);
|
||||
entropy_count = orig = READ_ONCE(r->entropy_count);
|
||||
if (nfrac < 0) {
|
||||
/* Debit */
|
||||
entropy_count += nfrac;
|
||||
|
@ -1265,7 +1265,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
|
|||
|
||||
/* Can we pull enough? */
|
||||
retry:
|
||||
entropy_count = orig = ACCESS_ONCE(r->entropy_count);
|
||||
entropy_count = orig = READ_ONCE(r->entropy_count);
|
||||
ibytes = nbytes;
|
||||
/* never pull more than available */
|
||||
have_bytes = entropy_count >> (ENTROPY_SHIFT + 3);
|
||||
|
|
|
@ -71,7 +71,7 @@ static irqreturn_t bcm2835_time_interrupt(int irq, void *dev_id)
|
|||
if (readl_relaxed(timer->control) & timer->match_mask) {
|
||||
writel_relaxed(timer->match_mask, timer->control);
|
||||
|
||||
event_handler = ACCESS_ONCE(timer->evt.event_handler);
|
||||
event_handler = READ_ONCE(timer->evt.event_handler);
|
||||
if (event_handler)
|
||||
event_handler(&timer->evt);
|
||||
return IRQ_HANDLED;
|
||||
|
|
|
@ -172,7 +172,7 @@ static void caam_jr_dequeue(unsigned long devarg)
|
|||
|
||||
while (rd_reg32(&jrp->rregs->outring_used)) {
|
||||
|
||||
head = ACCESS_ONCE(jrp->head);
|
||||
head = READ_ONCE(jrp->head);
|
||||
|
||||
spin_lock(&jrp->outlock);
|
||||
|
||||
|
@ -341,7 +341,7 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
|
|||
spin_lock_bh(&jrp->inplock);
|
||||
|
||||
head = jrp->head;
|
||||
tail = ACCESS_ONCE(jrp->tail);
|
||||
tail = READ_ONCE(jrp->tail);
|
||||
|
||||
if (!rd_reg32(&jrp->rregs->inpring_avail) ||
|
||||
CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) {
|
||||
|
|
|
@ -193,7 +193,7 @@ static int wait_for_csb(struct nx842_workmem *wmem,
|
|||
ktime_t start = wmem->start, now = ktime_get();
|
||||
ktime_t timeout = ktime_add_ms(start, CSB_WAIT_MAX);
|
||||
|
||||
while (!(ACCESS_ONCE(csb->flags) & CSB_V)) {
|
||||
while (!(READ_ONCE(csb->flags) & CSB_V)) {
|
||||
cpu_relax();
|
||||
now = ktime_get();
|
||||
if (ktime_after(now, timeout))
|
||||
|
|
|
@ -175,11 +175,11 @@ static ssize_t altr_sdr_mc_err_inject_write(struct file *file,
|
|||
/*
|
||||
* To trigger the error, we need to read the data back
|
||||
* (the data was written with errors above).
|
||||
* The ACCESS_ONCE macros and printk are used to prevent the
|
||||
* The READ_ONCE macros and printk are used to prevent the
|
||||
* the compiler optimizing these reads out.
|
||||
*/
|
||||
reg = ACCESS_ONCE(ptemp[0]);
|
||||
read_reg = ACCESS_ONCE(ptemp[1]);
|
||||
reg = READ_ONCE(ptemp[0]);
|
||||
read_reg = READ_ONCE(ptemp[1]);
|
||||
/* Force Read */
|
||||
rmb();
|
||||
|
||||
|
@ -618,7 +618,7 @@ static ssize_t altr_edac_device_trig(struct file *file,
|
|||
for (i = 0; i < (priv->trig_alloc_sz / sizeof(*ptemp)); i++) {
|
||||
/* Read data so we're in the correct state */
|
||||
rmb();
|
||||
if (ACCESS_ONCE(ptemp[i]))
|
||||
if (READ_ONCE(ptemp[i]))
|
||||
result = -1;
|
||||
/* Toggle Error bit (it is latched), leave ECC enabled */
|
||||
writel(error_mask, (drvdata->base + priv->set_err_ofst));
|
||||
|
@ -635,7 +635,7 @@ static ssize_t altr_edac_device_trig(struct file *file,
|
|||
|
||||
/* Read out written data. ECC error caused here */
|
||||
for (i = 0; i < ALTR_TRIGGER_READ_WRD_CNT; i++)
|
||||
if (ACCESS_ONCE(ptemp[i]) != i)
|
||||
if (READ_ONCE(ptemp[i]) != i)
|
||||
edac_printk(KERN_ERR, EDAC_DEVICE,
|
||||
"Read doesn't match written data\n");
|
||||
|
||||
|
|
|
@ -734,7 +734,7 @@ static unsigned int ar_search_last_active_buffer(struct ar_context *ctx,
|
|||
__le16 res_count, next_res_count;
|
||||
|
||||
i = ar_first_buffer_index(ctx);
|
||||
res_count = ACCESS_ONCE(ctx->descriptors[i].res_count);
|
||||
res_count = READ_ONCE(ctx->descriptors[i].res_count);
|
||||
|
||||
/* A buffer that is not yet completely filled must be the last one. */
|
||||
while (i != last && res_count == 0) {
|
||||
|
@ -742,8 +742,7 @@ static unsigned int ar_search_last_active_buffer(struct ar_context *ctx,
|
|||
/* Peek at the next descriptor. */
|
||||
next_i = ar_next_buffer_index(i);
|
||||
rmb(); /* read descriptors in order */
|
||||
next_res_count = ACCESS_ONCE(
|
||||
ctx->descriptors[next_i].res_count);
|
||||
next_res_count = READ_ONCE(ctx->descriptors[next_i].res_count);
|
||||
/*
|
||||
* If the next descriptor is still empty, we must stop at this
|
||||
* descriptor.
|
||||
|
@ -759,8 +758,7 @@ static unsigned int ar_search_last_active_buffer(struct ar_context *ctx,
|
|||
if (MAX_AR_PACKET_SIZE > PAGE_SIZE && i != last) {
|
||||
next_i = ar_next_buffer_index(next_i);
|
||||
rmb();
|
||||
next_res_count = ACCESS_ONCE(
|
||||
ctx->descriptors[next_i].res_count);
|
||||
next_res_count = READ_ONCE(ctx->descriptors[next_i].res_count);
|
||||
if (next_res_count != cpu_to_le16(PAGE_SIZE))
|
||||
goto next_buffer_is_active;
|
||||
}
|
||||
|
@ -2812,7 +2810,7 @@ static int handle_ir_buffer_fill(struct context *context,
|
|||
u32 buffer_dma;
|
||||
|
||||
req_count = le16_to_cpu(last->req_count);
|
||||
res_count = le16_to_cpu(ACCESS_ONCE(last->res_count));
|
||||
res_count = le16_to_cpu(READ_ONCE(last->res_count));
|
||||
completed = req_count - res_count;
|
||||
buffer_dma = le32_to_cpu(last->data_address);
|
||||
|
||||
|
|
|
@ -99,11 +99,11 @@ static inline bool tegra_ivc_empty(struct tegra_ivc *ivc,
|
|||
{
|
||||
/*
|
||||
* This function performs multiple checks on the same values with
|
||||
* security implications, so create snapshots with ACCESS_ONCE() to
|
||||
* security implications, so create snapshots with READ_ONCE() to
|
||||
* ensure that these checks use the same values.
|
||||
*/
|
||||
u32 tx = ACCESS_ONCE(header->tx.count);
|
||||
u32 rx = ACCESS_ONCE(header->rx.count);
|
||||
u32 tx = READ_ONCE(header->tx.count);
|
||||
u32 rx = READ_ONCE(header->rx.count);
|
||||
|
||||
/*
|
||||
* Perform an over-full check to prevent denial of service attacks
|
||||
|
@ -124,8 +124,8 @@ static inline bool tegra_ivc_empty(struct tegra_ivc *ivc,
|
|||
static inline bool tegra_ivc_full(struct tegra_ivc *ivc,
|
||||
struct tegra_ivc_header *header)
|
||||
{
|
||||
u32 tx = ACCESS_ONCE(header->tx.count);
|
||||
u32 rx = ACCESS_ONCE(header->rx.count);
|
||||
u32 tx = READ_ONCE(header->tx.count);
|
||||
u32 rx = READ_ONCE(header->rx.count);
|
||||
|
||||
/*
|
||||
* Invalid cases where the counters indicate that the queue is over
|
||||
|
@ -137,8 +137,8 @@ static inline bool tegra_ivc_full(struct tegra_ivc *ivc,
|
|||
static inline u32 tegra_ivc_available(struct tegra_ivc *ivc,
|
||||
struct tegra_ivc_header *header)
|
||||
{
|
||||
u32 tx = ACCESS_ONCE(header->tx.count);
|
||||
u32 rx = ACCESS_ONCE(header->rx.count);
|
||||
u32 tx = READ_ONCE(header->tx.count);
|
||||
u32 rx = READ_ONCE(header->rx.count);
|
||||
|
||||
/*
|
||||
* This function isn't expected to be used in scenarios where an
|
||||
|
@ -151,8 +151,8 @@ static inline u32 tegra_ivc_available(struct tegra_ivc *ivc,
|
|||
|
||||
static inline void tegra_ivc_advance_tx(struct tegra_ivc *ivc)
|
||||
{
|
||||
ACCESS_ONCE(ivc->tx.channel->tx.count) =
|
||||
ACCESS_ONCE(ivc->tx.channel->tx.count) + 1;
|
||||
WRITE_ONCE(ivc->tx.channel->tx.count,
|
||||
READ_ONCE(ivc->tx.channel->tx.count) + 1);
|
||||
|
||||
if (ivc->tx.position == ivc->num_frames - 1)
|
||||
ivc->tx.position = 0;
|
||||
|
@ -162,8 +162,8 @@ static inline void tegra_ivc_advance_tx(struct tegra_ivc *ivc)
|
|||
|
||||
static inline void tegra_ivc_advance_rx(struct tegra_ivc *ivc)
|
||||
{
|
||||
ACCESS_ONCE(ivc->rx.channel->rx.count) =
|
||||
ACCESS_ONCE(ivc->rx.channel->rx.count) + 1;
|
||||
WRITE_ONCE(ivc->rx.channel->rx.count,
|
||||
READ_ONCE(ivc->rx.channel->rx.count) + 1);
|
||||
|
||||
if (ivc->rx.position == ivc->num_frames - 1)
|
||||
ivc->rx.position = 0;
|
||||
|
@ -428,7 +428,7 @@ int tegra_ivc_notified(struct tegra_ivc *ivc)
|
|||
|
||||
/* Copy the receiver's state out of shared memory. */
|
||||
tegra_ivc_invalidate(ivc, ivc->rx.phys + offset);
|
||||
state = ACCESS_ONCE(ivc->rx.channel->tx.state);
|
||||
state = READ_ONCE(ivc->rx.channel->tx.state);
|
||||
|
||||
if (state == TEGRA_IVC_STATE_SYNC) {
|
||||
offset = offsetof(struct tegra_ivc_header, tx.count);
|
||||
|
|
|
@ -260,7 +260,7 @@ static void amdgpu_fence_fallback(unsigned long arg)
|
|||
*/
|
||||
int amdgpu_fence_wait_empty(struct amdgpu_ring *ring)
|
||||
{
|
||||
uint64_t seq = ACCESS_ONCE(ring->fence_drv.sync_seq);
|
||||
uint64_t seq = READ_ONCE(ring->fence_drv.sync_seq);
|
||||
struct dma_fence *fence, **ptr;
|
||||
int r;
|
||||
|
||||
|
@ -300,7 +300,7 @@ unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring)
|
|||
amdgpu_fence_process(ring);
|
||||
emitted = 0x100000000ull;
|
||||
emitted -= atomic_read(&ring->fence_drv.last_seq);
|
||||
emitted += ACCESS_ONCE(ring->fence_drv.sync_seq);
|
||||
emitted += READ_ONCE(ring->fence_drv.sync_seq);
|
||||
return lower_32_bits(emitted);
|
||||
}
|
||||
|
||||
|
|
|
@ -788,11 +788,11 @@ static int amdgpu_debugfs_gem_bo_info(int id, void *ptr, void *data)
|
|||
seq_printf(m, "\t0x%08x: %12ld byte %s",
|
||||
id, amdgpu_bo_size(bo), placement);
|
||||
|
||||
offset = ACCESS_ONCE(bo->tbo.mem.start);
|
||||
offset = READ_ONCE(bo->tbo.mem.start);
|
||||
if (offset != AMDGPU_BO_INVALID_OFFSET)
|
||||
seq_printf(m, " @ 0x%010Lx", offset);
|
||||
|
||||
pin_count = ACCESS_ONCE(bo->pin_count);
|
||||
pin_count = READ_ONCE(bo->pin_count);
|
||||
if (pin_count)
|
||||
seq_printf(m, " pin count %d", pin_count);
|
||||
seq_printf(m, "\n");
|
||||
|
|
|
@ -187,7 +187,7 @@ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity)
|
|||
if (kfifo_is_empty(&entity->job_queue))
|
||||
return false;
|
||||
|
||||
if (ACCESS_ONCE(entity->dependency))
|
||||
if (READ_ONCE(entity->dependency))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
|
|
@ -451,7 +451,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
|
|||
else
|
||||
r = 0;
|
||||
|
||||
cur_placement = ACCESS_ONCE(robj->tbo.mem.mem_type);
|
||||
cur_placement = READ_ONCE(robj->tbo.mem.mem_type);
|
||||
args->domain = radeon_mem_type_to_domain(cur_placement);
|
||||
drm_gem_object_put_unlocked(gobj);
|
||||
return r;
|
||||
|
@ -481,7 +481,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
|
|||
r = ret;
|
||||
|
||||
/* Flush HDP cache via MMIO if necessary */
|
||||
cur_placement = ACCESS_ONCE(robj->tbo.mem.mem_type);
|
||||
cur_placement = READ_ONCE(robj->tbo.mem.mem_type);
|
||||
if (rdev->asic->mmio_hdp_flush &&
|
||||
radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM)
|
||||
robj->rdev->asic->mmio_hdp_flush(rdev);
|
||||
|
|
|
@ -904,7 +904,7 @@ vmw_surface_handle_reference(struct vmw_private *dev_priv,
|
|||
if (unlikely(drm_is_render_client(file_priv)))
|
||||
require_exist = true;
|
||||
|
||||
if (ACCESS_ONCE(vmw_fpriv(file_priv)->locked_master)) {
|
||||
if (READ_ONCE(vmw_fpriv(file_priv)->locked_master)) {
|
||||
DRM_ERROR("Locked master refused legacy "
|
||||
"surface reference.\n");
|
||||
return -EACCES;
|
||||
|
|
|
@ -380,7 +380,7 @@ static long hfi1_file_ioctl(struct file *fp, unsigned int cmd,
|
|||
if (sc->flags & SCF_FROZEN) {
|
||||
wait_event_interruptible_timeout(
|
||||
dd->event_queue,
|
||||
!(ACCESS_ONCE(dd->flags) & HFI1_FROZEN),
|
||||
!(READ_ONCE(dd->flags) & HFI1_FROZEN),
|
||||
msecs_to_jiffies(SEND_CTXT_HALT_TIMEOUT));
|
||||
if (dd->flags & HFI1_FROZEN)
|
||||
return -ENOLCK;
|
||||
|
|
|
@ -1423,14 +1423,14 @@ retry:
|
|||
goto done;
|
||||
}
|
||||
/* copy from receiver cache line and recalculate */
|
||||
sc->alloc_free = ACCESS_ONCE(sc->free);
|
||||
sc->alloc_free = READ_ONCE(sc->free);
|
||||
avail =
|
||||
(unsigned long)sc->credits -
|
||||
(sc->fill - sc->alloc_free);
|
||||
if (blocks > avail) {
|
||||
/* still no room, actively update */
|
||||
sc_release_update(sc);
|
||||
sc->alloc_free = ACCESS_ONCE(sc->free);
|
||||
sc->alloc_free = READ_ONCE(sc->free);
|
||||
trycount++;
|
||||
goto retry;
|
||||
}
|
||||
|
@ -1667,7 +1667,7 @@ void sc_release_update(struct send_context *sc)
|
|||
|
||||
/* call sent buffer callbacks */
|
||||
code = -1; /* code not yet set */
|
||||
head = ACCESS_ONCE(sc->sr_head); /* snapshot the head */
|
||||
head = READ_ONCE(sc->sr_head); /* snapshot the head */
|
||||
tail = sc->sr_tail;
|
||||
while (head != tail) {
|
||||
pbuf = &sc->sr[tail].pbuf;
|
||||
|
|
|
@ -363,7 +363,7 @@ static void ruc_loopback(struct rvt_qp *sqp)
|
|||
|
||||
again:
|
||||
smp_read_barrier_depends(); /* see post_one_send() */
|
||||
if (sqp->s_last == ACCESS_ONCE(sqp->s_head))
|
||||
if (sqp->s_last == READ_ONCE(sqp->s_head))
|
||||
goto clr_busy;
|
||||
wqe = rvt_get_swqe_ptr(sqp, sqp->s_last);
|
||||
|
||||
|
|
|
@ -1725,7 +1725,7 @@ retry:
|
|||
|
||||
swhead = sde->descq_head & sde->sdma_mask;
|
||||
/* this code is really bad for cache line trading */
|
||||
swtail = ACCESS_ONCE(sde->descq_tail) & sde->sdma_mask;
|
||||
swtail = READ_ONCE(sde->descq_tail) & sde->sdma_mask;
|
||||
cnt = sde->descq_cnt;
|
||||
|
||||
if (swhead < swtail)
|
||||
|
@ -1872,7 +1872,7 @@ retry:
|
|||
if ((status & sde->idle_mask) && !idle_check_done) {
|
||||
u16 swtail;
|
||||
|
||||
swtail = ACCESS_ONCE(sde->descq_tail) & sde->sdma_mask;
|
||||
swtail = READ_ONCE(sde->descq_tail) & sde->sdma_mask;
|
||||
if (swtail != hwhead) {
|
||||
hwhead = (u16)read_sde_csr(sde, SD(HEAD));
|
||||
idle_check_done = 1;
|
||||
|
@ -2222,7 +2222,7 @@ void sdma_seqfile_dump_sde(struct seq_file *s, struct sdma_engine *sde)
|
|||
u16 len;
|
||||
|
||||
head = sde->descq_head & sde->sdma_mask;
|
||||
tail = ACCESS_ONCE(sde->descq_tail) & sde->sdma_mask;
|
||||
tail = READ_ONCE(sde->descq_tail) & sde->sdma_mask;
|
||||
seq_printf(s, SDE_FMT, sde->this_idx,
|
||||
sde->cpu,
|
||||
sdma_state_name(sde->state.current_state),
|
||||
|
@ -3305,7 +3305,7 @@ int sdma_ahg_alloc(struct sdma_engine *sde)
|
|||
return -EINVAL;
|
||||
}
|
||||
while (1) {
|
||||
nr = ffz(ACCESS_ONCE(sde->ahg_bits));
|
||||
nr = ffz(READ_ONCE(sde->ahg_bits));
|
||||
if (nr > 31) {
|
||||
trace_hfi1_ahg_allocate(sde, -ENOSPC);
|
||||
return -ENOSPC;
|
||||
|
|
|
@ -445,7 +445,7 @@ static inline u16 sdma_descq_freecnt(struct sdma_engine *sde)
|
|||
{
|
||||
return sde->descq_cnt -
|
||||
(sde->descq_tail -
|
||||
ACCESS_ONCE(sde->descq_head)) - 1;
|
||||
READ_ONCE(sde->descq_head)) - 1;
|
||||
}
|
||||
|
||||
static inline u16 sdma_descq_inprocess(struct sdma_engine *sde)
|
||||
|
|
|
@ -80,7 +80,7 @@ int hfi1_make_uc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
|
|||
goto bail;
|
||||
/* We are in the error state, flush the work request. */
|
||||
smp_read_barrier_depends(); /* see post_one_send() */
|
||||
if (qp->s_last == ACCESS_ONCE(qp->s_head))
|
||||
if (qp->s_last == READ_ONCE(qp->s_head))
|
||||
goto bail;
|
||||
/* If DMAs are in progress, we can't flush immediately. */
|
||||
if (iowait_sdma_pending(&priv->s_iowait)) {
|
||||
|
@ -121,7 +121,7 @@ int hfi1_make_uc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
|
|||
goto bail;
|
||||
/* Check if send work queue is empty. */
|
||||
smp_read_barrier_depends(); /* see post_one_send() */
|
||||
if (qp->s_cur == ACCESS_ONCE(qp->s_head)) {
|
||||
if (qp->s_cur == READ_ONCE(qp->s_head)) {
|
||||
clear_ahg(qp);
|
||||
goto bail;
|
||||
}
|
||||
|
|
|
@ -487,7 +487,7 @@ int hfi1_make_ud_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
|
|||
goto bail;
|
||||
/* We are in the error state, flush the work request. */
|
||||
smp_read_barrier_depends(); /* see post_one_send */
|
||||
if (qp->s_last == ACCESS_ONCE(qp->s_head))
|
||||
if (qp->s_last == READ_ONCE(qp->s_head))
|
||||
goto bail;
|
||||
/* If DMAs are in progress, we can't flush immediately. */
|
||||
if (iowait_sdma_pending(&priv->s_iowait)) {
|
||||
|
@ -501,7 +501,7 @@ int hfi1_make_ud_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
|
|||
|
||||
/* see post_one_send() */
|
||||
smp_read_barrier_depends();
|
||||
if (qp->s_cur == ACCESS_ONCE(qp->s_head))
|
||||
if (qp->s_cur == READ_ONCE(qp->s_head))
|
||||
goto bail;
|
||||
|
||||
wqe = rvt_get_swqe_ptr(qp, qp->s_cur);
|
||||
|
|
|
@ -276,7 +276,7 @@ int hfi1_user_sdma_free_queues(struct hfi1_filedata *fd,
|
|||
/* Wait until all requests have been freed. */
|
||||
wait_event_interruptible(
|
||||
pq->wait,
|
||||
(ACCESS_ONCE(pq->state) == SDMA_PKT_Q_INACTIVE));
|
||||
(READ_ONCE(pq->state) == SDMA_PKT_Q_INACTIVE));
|
||||
kfree(pq->reqs);
|
||||
kfree(pq->req_in_use);
|
||||
kmem_cache_destroy(pq->txreq_cache);
|
||||
|
@ -591,7 +591,7 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
|
|||
if (ret != -EBUSY) {
|
||||
req->status = ret;
|
||||
WRITE_ONCE(req->has_error, 1);
|
||||
if (ACCESS_ONCE(req->seqcomp) ==
|
||||
if (READ_ONCE(req->seqcomp) ==
|
||||
req->seqsubmitted - 1)
|
||||
goto free_req;
|
||||
return ret;
|
||||
|
@ -825,7 +825,7 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
|
|||
*/
|
||||
if (req->data_len) {
|
||||
iovec = &req->iovs[req->iov_idx];
|
||||
if (ACCESS_ONCE(iovec->offset) == iovec->iov.iov_len) {
|
||||
if (READ_ONCE(iovec->offset) == iovec->iov.iov_len) {
|
||||
if (++req->iov_idx == req->data_iovs) {
|
||||
ret = -EFAULT;
|
||||
goto free_txreq;
|
||||
|
@ -1390,7 +1390,7 @@ static void user_sdma_txreq_cb(struct sdma_txreq *txreq, int status)
|
|||
} else {
|
||||
if (status != SDMA_TXREQ_S_OK)
|
||||
req->status = status;
|
||||
if (req->seqcomp == (ACCESS_ONCE(req->seqsubmitted) - 1) &&
|
||||
if (req->seqcomp == (READ_ONCE(req->seqsubmitted) - 1) &&
|
||||
(READ_ONCE(req->done) ||
|
||||
READ_ONCE(req->has_error))) {
|
||||
user_sdma_free_request(req, false);
|
||||
|
|
|
@ -368,7 +368,7 @@ static void qib_ruc_loopback(struct rvt_qp *sqp)
|
|||
|
||||
again:
|
||||
smp_read_barrier_depends(); /* see post_one_send() */
|
||||
if (sqp->s_last == ACCESS_ONCE(sqp->s_head))
|
||||
if (sqp->s_last == READ_ONCE(sqp->s_head))
|
||||
goto clr_busy;
|
||||
wqe = rvt_get_swqe_ptr(sqp, sqp->s_last);
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ int qib_make_uc_req(struct rvt_qp *qp, unsigned long *flags)
|
|||
goto bail;
|
||||
/* We are in the error state, flush the work request. */
|
||||
smp_read_barrier_depends(); /* see post_one_send() */
|
||||
if (qp->s_last == ACCESS_ONCE(qp->s_head))
|
||||
if (qp->s_last == READ_ONCE(qp->s_head))
|
||||
goto bail;
|
||||
/* If DMAs are in progress, we can't flush immediately. */
|
||||
if (atomic_read(&priv->s_dma_busy)) {
|
||||
|
@ -91,7 +91,7 @@ int qib_make_uc_req(struct rvt_qp *qp, unsigned long *flags)
|
|||
goto bail;
|
||||
/* Check if send work queue is empty. */
|
||||
smp_read_barrier_depends(); /* see post_one_send() */
|
||||
if (qp->s_cur == ACCESS_ONCE(qp->s_head))
|
||||
if (qp->s_cur == READ_ONCE(qp->s_head))
|
||||
goto bail;
|
||||
/*
|
||||
* Start a new request.
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче