Lines Matching +full:load +full:- +full:acquire
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
13 #define arch_spin_is_locked(x) ((x)->slock != __ARCH_SPIN_LOCK_UNLOCKED__)
24 " scond %[LOCKED], [%[slock]] \n" /* acquire */ in arch_spin_lock()
28 : [slock] "r" (&(lock->slock)), in arch_spin_lock()
33 * ACQUIRE barrier to ensure load/store after taking the lock in arch_spin_lock()
34 * don't "bleed-up" out of the critical section (leak-in is allowed) in arch_spin_lock()
37 * ARCv2 only has load-load, store-store and all-all barrier in arch_spin_lock()
38 * thus need the full all-all barrier in arch_spin_lock()
43 /* 1 - lock taken successfully */
51 " scond %[LOCKED], [%[slock]] \n" /* acquire */ in arch_spin_trylock()
58 : [slock] "r" (&(lock->slock)), in arch_spin_trylock()
71 WRITE_ONCE(lock->slock, __ARCH_SPIN_LOCK_UNLOCKED__); in arch_spin_unlock()
75 * Read-write spinlocks, allowing multiple readers but only one writer.
87 * if (rw->counter > 0) { in arch_read_lock()
88 * rw->counter--; in arch_read_lock()
101 : [rwlock] "r" (&(rw->counter)), in arch_read_lock()
108 /* 1 - lock taken successfully */
116 " sub %[val], %[val], 1 \n" /* counter-- */ in arch_read_trylock()
121 "4: ; --- done --- \n" in arch_read_trylock()
125 : [rwlock] "r" (&(rw->counter)), in arch_read_trylock()
144 * if (rw->counter == __ARCH_RW_LOCK_UNLOCKED__) { in arch_write_lock()
145 * rw->counter = 0; in arch_write_lock()
158 : [rwlock] "r" (&(rw->counter)), in arch_write_lock()
166 /* 1 - lock taken successfully */
179 "4: ; --- done --- \n" in arch_write_trylock()
183 : [rwlock] "r" (&(rw->counter)), in arch_write_trylock()
200 * rw->counter++; in arch_read_unlock()
209 : [rwlock] "r" (&(rw->counter)) in arch_read_unlock()
217 WRITE_ONCE(rw->counter, __ARCH_RW_LOCK_UNLOCKED__); in arch_write_unlock()
237 : "r"(&(lock->slock)), "ir"(__ARCH_SPIN_LOCK_LOCKED__) in arch_spin_lock()
243 /* 1 - lock taken successfully */
253 : "r"(&(lock->slock)) in arch_spin_trylock()
280 : "r"(&(lock->slock)) in arch_spin_unlock()
290 * Read-write spinlocks, allowing multiple readers but only one writer.
297 /* 1 - lock taken successfully */
304 arch_spin_lock(&(rw->lock_mutex)); in arch_read_trylock()
310 if (rw->counter > 0) { in arch_read_trylock()
311 rw->counter--; in arch_read_trylock()
315 arch_spin_unlock(&(rw->lock_mutex)); in arch_read_trylock()
321 /* 1 - lock taken successfully */
328 arch_spin_lock(&(rw->lock_mutex)); in arch_write_trylock()
336 if (rw->counter == __ARCH_RW_LOCK_UNLOCKED__) { in arch_write_trylock()
337 rw->counter = 0; in arch_write_trylock()
340 arch_spin_unlock(&(rw->lock_mutex)); in arch_write_trylock()
363 arch_spin_lock(&(rw->lock_mutex)); in arch_read_unlock()
364 rw->counter++; in arch_read_unlock()
365 arch_spin_unlock(&(rw->lock_mutex)); in arch_read_unlock()
374 arch_spin_lock(&(rw->lock_mutex)); in arch_write_unlock()
375 rw->counter = __ARCH_RW_LOCK_UNLOCKED__; in arch_write_unlock()
376 arch_spin_unlock(&(rw->lock_mutex)); in arch_write_unlock()