1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_SPINLOCK_UP_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __LINUX_SPINLOCK_UP_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_SPINLOCK_H 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# error "please don't include this file directly" 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * include/linux/spinlock_up.h - UP-debug version of spinlocks. 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * portions Copyright 2005, Red Hat, Inc., Ingo Molnar 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Released under the General Public License (GPL). 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * In the debug case, 1 means unlocked, 0 means locked. (the values 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * are inverted, to catch initialization bugs) 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * No atomicity anywhere, we are on UP. 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_SPINLOCK 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_spin_is_locked(x) ((x)->slock == 0) 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __raw_spin_lock(raw_spinlock_t *lock) 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru lock->slock = 0; 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru lock->slock = 0; 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int __raw_spin_trylock(raw_spinlock_t *lock) 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char oldval = lock->slock; 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru lock->slock = 0; 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return oldval > 0; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __raw_spin_unlock(raw_spinlock_t *lock) 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru lock->slock = 1; 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Read-write spinlocks. No debug version. 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_lock(lock) do { (void)(lock); } while (0) 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_lock(lock) do { (void)(lock); } while (0) 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_trylock(lock) ({ (void)(lock); 1; }) 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_trylock(lock) ({ (void)(lock); 1; }) 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_unlock(lock) do { (void)(lock); } while (0) 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_unlock(lock) do { (void)(lock); } while (0) 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* DEBUG_SPINLOCK */ 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_spin_is_locked(lock) ((void)(lock), 0) 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* for sched.c and kernel_lock.c: */ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define __raw_spin_lock(lock) do { (void)(lock); } while (0) 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define __raw_spin_unlock(lock) do { (void)(lock); } while (0) 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define __raw_spin_trylock(lock) ({ (void)(lock); 1; }) 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* DEBUG_SPINLOCK */ 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_can_lock(lock) (((void)(lock), 1)) 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_can_lock(lock) (((void)(lock), 1)) 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_spin_unlock_wait(lock) \ 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { cpu_relax(); } while (__raw_spin_is_locked(lock)) 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_SPINLOCK_UP_H */ 74