1 #ifndef __LINUX_RWLOCK_TYPES_H 2 #define __LINUX_RWLOCK_TYPES_H 3 4 #if !defined(__LINUX_SPINLOCK_TYPES_H) 5 # error "Do not include directly, include spinlock_types.h" 6 #endif 7 8 #ifdef CONFIG_DEBUG_LOCK_ALLOC 9 # define RW_DEP_MAP_INIT(lockname) \ 10 .dep_map = { \ 11 .name = #lockname, \ 12 .wait_type_inner = LD_WAIT_CONFIG, \ 13 } 14 #else 15 # define RW_DEP_MAP_INIT(lockname) 16 #endif 17 18 #ifndef CONFIG_PREEMPT_RT 19 /* 20 * generic rwlock type definitions and initializers 21 * 22 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar 23 * Released under the General Public License (GPL). 24 */ 25 typedef struct { 26 arch_rwlock_t raw_lock; 27 #ifdef CONFIG_DEBUG_SPINLOCK 28 unsigned int magic, owner_cpu; 29 void *owner; 30 #endif 31 #ifdef CONFIG_DEBUG_LOCK_ALLOC 32 struct lockdep_map dep_map; 33 #endif 34 } rwlock_t; 35 36 #define RWLOCK_MAGIC 0xdeaf1eed 37 38 #ifdef CONFIG_DEBUG_SPINLOCK 39 #define __RW_LOCK_UNLOCKED(lockname) \ 40 (rwlock_t) { .raw_lock = __ARCH_RW_LOCK_UNLOCKED, \ 41 .magic = RWLOCK_MAGIC, \ 42 .owner = SPINLOCK_OWNER_INIT, \ 43 .owner_cpu = -1, \ 44 RW_DEP_MAP_INIT(lockname) } 45 #else 46 #define __RW_LOCK_UNLOCKED(lockname) \ 47 (rwlock_t) { .raw_lock = __ARCH_RW_LOCK_UNLOCKED, \ 48 RW_DEP_MAP_INIT(lockname) } 49 #endif 50 51 #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) 52 53 #else /* !CONFIG_PREEMPT_RT */ 54 55 #include <linux/rwbase_rt.h> 56 57 typedef struct { 58 struct rwbase_rt rwbase; 59 atomic_t readers; 60 #ifdef CONFIG_DEBUG_LOCK_ALLOC 61 struct lockdep_map dep_map; 62 #endif 63 } rwlock_t; 64 65 #define __RWLOCK_RT_INITIALIZER(name) \ 66 { \ 67 .rwbase = __RWBASE_INITIALIZER(name), \ 68 RW_DEP_MAP_INIT(name) \ 69 } 70 71 #define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name) 72 73 #define DEFINE_RWLOCK(name) \ 74 rwlock_t name = __RW_LOCK_UNLOCKED(name) 75 76 #endif /* CONFIG_PREEMPT_RT */ 77 78 #endif /* __LINUX_RWLOCK_TYPES_H */ 79