1 #ifndef __LINUX_SPINLOCK_TYPES_H 2 #define __LINUX_SPINLOCK_TYPES_H 3 4 /* 5 * include/linux/spinlock_types.h - generic spinlock type definitions 6 * and initializers 7 * 8 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar 9 * Released under the General Public License (GPL). 10 */ 11 12 #include <linux/lockdep.h> 13 14 #if defined(CONFIG_SMP) 15 # include <asm/spinlock_types.h> 16 #else 17 # include <linux/spinlock_types_up.h> 18 #endif 19 20 typedef struct { 21 raw_spinlock_t raw_lock; 22 #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) 23 unsigned int break_lock; 24 #endif 25 #ifdef CONFIG_DEBUG_SPINLOCK 26 unsigned int magic, owner_cpu; 27 void *owner; 28 #endif 29 #ifdef CONFIG_DEBUG_LOCK_ALLOC 30 struct lockdep_map dep_map; 31 #endif 32 } spinlock_t; 33 34 #define SPINLOCK_MAGIC 0xdead4ead 35 36 typedef struct { 37 raw_rwlock_t raw_lock; 38 #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) 39 unsigned int break_lock; 40 #endif 41 #ifdef CONFIG_DEBUG_SPINLOCK 42 unsigned int magic, owner_cpu; 43 void *owner; 44 #endif 45 #ifdef CONFIG_DEBUG_LOCK_ALLOC 46 struct lockdep_map dep_map; 47 #endif 48 } rwlock_t; 49 50 #define RWLOCK_MAGIC 0xdeaf1eed 51 52 #define SPINLOCK_OWNER_INIT ((void *)-1L) 53 54 #ifdef CONFIG_DEBUG_LOCK_ALLOC 55 # define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } 56 #else 57 # define SPIN_DEP_MAP_INIT(lockname) 58 #endif 59 60 #ifdef CONFIG_DEBUG_LOCK_ALLOC 61 # define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } 62 #else 63 # define RW_DEP_MAP_INIT(lockname) 64 #endif 65 66 #ifdef CONFIG_DEBUG_SPINLOCK 67 # define __SPIN_LOCK_UNLOCKED(lockname) \ 68 (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ 69 .magic = SPINLOCK_MAGIC, \ 70 .owner = SPINLOCK_OWNER_INIT, \ 71 .owner_cpu = -1, \ 72 SPIN_DEP_MAP_INIT(lockname) } 73 #define __RW_LOCK_UNLOCKED(lockname) \ 74 (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ 75 .magic = RWLOCK_MAGIC, \ 76 .owner = SPINLOCK_OWNER_INIT, \ 77 .owner_cpu = -1, \ 78 RW_DEP_MAP_INIT(lockname) } 79 #else 80 # define __SPIN_LOCK_UNLOCKED(lockname) \ 81 (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ 82 SPIN_DEP_MAP_INIT(lockname) } 83 #define __RW_LOCK_UNLOCKED(lockname) \ 84 (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ 85 RW_DEP_MAP_INIT(lockname) } 86 #endif 87 88 #define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init) 89 #define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init) 90 91 #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) 92 #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) 93 94 #endif /* __LINUX_SPINLOCK_TYPES_H */ 95