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 #if defined(CONFIG_SMP) 13 # include <asm/spinlock_types.h> 14 #else 15 # include <linux/spinlock_types_up.h> 16 #endif 17 18 #include <linux/lockdep_types.h> 19 20 typedef struct raw_spinlock { 21 arch_spinlock_t raw_lock; 22 #ifdef CONFIG_DEBUG_SPINLOCK 23 unsigned int magic, owner_cpu; 24 void *owner; 25 #endif 26 #ifdef CONFIG_DEBUG_LOCK_ALLOC 27 struct lockdep_map dep_map; 28 #endif 29 } raw_spinlock_t; 30 31 #define SPINLOCK_MAGIC 0xdead4ead 32 33 #define SPINLOCK_OWNER_INIT ((void *)-1L) 34 35 #ifdef CONFIG_DEBUG_LOCK_ALLOC 36 # define RAW_SPIN_DEP_MAP_INIT(lockname) \ 37 .dep_map = { \ 38 .name = #lockname, \ 39 .wait_type_inner = LD_WAIT_SPIN, \ 40 } 41 # define SPIN_DEP_MAP_INIT(lockname) \ 42 .dep_map = { \ 43 .name = #lockname, \ 44 .wait_type_inner = LD_WAIT_CONFIG, \ 45 } 46 #else 47 # define RAW_SPIN_DEP_MAP_INIT(lockname) 48 # define SPIN_DEP_MAP_INIT(lockname) 49 #endif 50 51 #ifdef CONFIG_DEBUG_SPINLOCK 52 # define SPIN_DEBUG_INIT(lockname) \ 53 .magic = SPINLOCK_MAGIC, \ 54 .owner_cpu = -1, \ 55 .owner = SPINLOCK_OWNER_INIT, 56 #else 57 # define SPIN_DEBUG_INIT(lockname) 58 #endif 59 60 #define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ 61 { \ 62 .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ 63 SPIN_DEBUG_INIT(lockname) \ 64 RAW_SPIN_DEP_MAP_INIT(lockname) } 65 66 #define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ 67 (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) 68 69 #define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) 70 71 typedef struct spinlock { 72 union { 73 struct raw_spinlock rlock; 74 75 #ifdef CONFIG_DEBUG_LOCK_ALLOC 76 # define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) 77 struct { 78 u8 __padding[LOCK_PADSIZE]; 79 struct lockdep_map dep_map; 80 }; 81 #endif 82 }; 83 } spinlock_t; 84 85 #define ___SPIN_LOCK_INITIALIZER(lockname) \ 86 { \ 87 .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ 88 SPIN_DEBUG_INIT(lockname) \ 89 SPIN_DEP_MAP_INIT(lockname) } 90 91 #define __SPIN_LOCK_INITIALIZER(lockname) \ 92 { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } } 93 94 #define __SPIN_LOCK_UNLOCKED(lockname) \ 95 (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname) 96 97 #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) 98 99 #include <linux/rwlock_types.h> 100 101 #endif /* __LINUX_SPINLOCK_TYPES_H */ 102