|
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.h> |
|
19 |
|
20 typedef struct { |
|
21 raw_spinlock_t raw_lock; |
|
22 #ifdef CONFIG_GENERIC_LOCKBREAK |
|
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 #ifdef CONFIG_GENERIC_LOCKBREAK |
|
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 /* |
|
89 * SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and |
|
90 * are hence deprecated. |
|
91 * Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or |
|
92 * __SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate. |
|
93 */ |
|
94 #define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init) |
|
95 #define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init) |
|
96 |
|
97 #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) |
|
98 #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) |
|
99 |
|
100 #endif /* __LINUX_SPINLOCK_TYPES_H */ |