int _raw_read_trylock(rwlock_t *lock) { int ret = __raw_read_trylock(&lock->raw_lock); #ifndef CONFIG_SMP /* * Must not happen on UP: */ RWLOCK_BUG_ON(!ret, lock, "trylock failure on UP"); #endif return ret; }
/* * Must not happen on UP: */ SPIN_BUG_ON(!ret, lock, "trylock failure on UP"); #endif return ret; } void _raw_spin_unlock(spinlock_t *lock) { debug_spin_unlock(lock); __raw_spin_unlock(&lock->raw_lock); } static void rwlock_bug(rwlock_t *lock, const char *msg) { if (!debug_locks_off()) return; printk(KERN_EMERG "BUG: rwlock %s on CPU#%d, %s/%d, %p (%s)\n", msg, raw_smp_processor_id(), current->comm, current->pid, lock, print_tainted()); dump_stack(); } #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) #if 0 /* __write_lock_debug() can lock up - maybe this can too? */ static void __read_lock_debug(rwlock_t *lock) { int print_once = 1; u64 i; for (;;) { for (i = 0; i < loops_per_jiffy * HZ; i++) { if (__raw_read_trylock(&lock->raw_lock)) return; } /* lockup suspected: */ if (print_once) { print_once = 0; printk(KERN_EMERG "BUG: read-lock lockup on CPU#%d, " "%s/%d, %p (%s)\n", raw_smp_processor_id(), current->comm, current->pid, lock, print_tainted()); dump_stack(); } } }
int __lockfunc _raw_read_trylock(rwlock_t *lock) { return __raw_read_trylock(lock); }
void _raw_read_lock(rwlock_t *lock) { RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic"); if (unlikely(!__raw_read_trylock(&lock->raw_lock))) __read_lock_debug(lock); }