Rev 1408 | Rev 5272 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1408 | Rev 3243 | ||
---|---|---|---|
1 | #ifndef __LINUX_SPINLOCK_TYPES_H |
1 | #ifndef __LINUX_SPINLOCK_TYPES_H |
2 | #define __LINUX_SPINLOCK_TYPES_H |
2 | #define __LINUX_SPINLOCK_TYPES_H |
3 | 3 | ||
4 | /* |
4 | /* |
5 | * include/linux/spinlock_types.h - generic spinlock type definitions |
5 | * include/linux/spinlock_types.h - generic spinlock type definitions |
6 | * and initializers |
6 | * and initializers |
7 | * |
7 | * |
8 | * portions Copyright 2005, Red Hat, Inc., Ingo Molnar |
8 | * portions Copyright 2005, Red Hat, Inc., Ingo Molnar |
9 | * Released under the General Public License (GPL). |
9 | * Released under the General Public License (GPL). |
10 | */ |
10 | */ |
11 | 11 | ||
12 | #if defined(CONFIG_SMP) |
12 | #if defined(CONFIG_SMP) |
13 | # include |
13 | # include |
14 | #else |
14 | #else |
15 | # include |
15 | # include |
16 | #endif |
16 | #endif |
17 | 17 | ||
18 | #include |
18 | #include |
19 | 19 | ||
20 | typedef struct { |
20 | typedef struct spinlock { |
21 | raw_spinlock_t raw_lock; |
21 | raw_spinlock_t raw_lock; |
22 | #ifdef CONFIG_GENERIC_LOCKBREAK |
22 | #ifdef CONFIG_GENERIC_LOCKBREAK |
23 | unsigned int break_lock; |
23 | unsigned int break_lock; |
24 | #endif |
24 | #endif |
25 | #ifdef CONFIG_DEBUG_SPINLOCK |
25 | #ifdef CONFIG_DEBUG_SPINLOCK |
26 | unsigned int magic, owner_cpu; |
26 | unsigned int magic, owner_cpu; |
27 | void *owner; |
27 | void *owner; |
28 | #endif |
28 | #endif |
29 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
29 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
30 | struct lockdep_map dep_map; |
30 | struct lockdep_map dep_map; |
31 | #endif |
31 | #endif |
32 | } spinlock_t; |
32 | } spinlock_t; |
33 | 33 | ||
34 | #define SPINLOCK_MAGIC 0xdead4ead |
34 | #define SPINLOCK_MAGIC 0xdead4ead |
35 | 35 | ||
36 | typedef struct { |
36 | typedef struct { |
37 | raw_rwlock_t raw_lock; |
37 | raw_rwlock_t raw_lock; |
38 | #ifdef CONFIG_GENERIC_LOCKBREAK |
38 | #ifdef CONFIG_GENERIC_LOCKBREAK |
39 | unsigned int break_lock; |
39 | unsigned int break_lock; |
40 | #endif |
40 | #endif |
41 | #ifdef CONFIG_DEBUG_SPINLOCK |
41 | #ifdef CONFIG_DEBUG_SPINLOCK |
42 | unsigned int magic, owner_cpu; |
42 | unsigned int magic, owner_cpu; |
43 | void *owner; |
43 | void *owner; |
44 | #endif |
44 | #endif |
45 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
45 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
46 | struct lockdep_map dep_map; |
46 | struct lockdep_map dep_map; |
47 | #endif |
47 | #endif |
48 | } rwlock_t; |
48 | } rwlock_t; |
49 | 49 | ||
50 | #define RWLOCK_MAGIC 0xdeaf1eed |
50 | #define RWLOCK_MAGIC 0xdeaf1eed |
51 | 51 | ||
52 | #define SPINLOCK_OWNER_INIT ((void *)-1L) |
52 | #define SPINLOCK_OWNER_INIT ((void *)-1L) |
53 | 53 | ||
54 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
54 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
55 | # define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } |
55 | # define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } |
56 | #else |
56 | #else |
57 | # define SPIN_DEP_MAP_INIT(lockname) |
57 | # define SPIN_DEP_MAP_INIT(lockname) |
58 | #endif |
58 | #endif |
59 | 59 | ||
60 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
60 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
61 | # define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } |
61 | # define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } |
62 | #else |
62 | #else |
63 | # define RW_DEP_MAP_INIT(lockname) |
63 | # define RW_DEP_MAP_INIT(lockname) |
64 | #endif |
64 | #endif |
65 | 65 | ||
66 | #ifdef CONFIG_DEBUG_SPINLOCK |
66 | #ifdef CONFIG_DEBUG_SPINLOCK |
67 | # define __SPIN_LOCK_UNLOCKED(lockname) \ |
67 | # define __SPIN_LOCK_UNLOCKED(lockname) \ |
68 | (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ |
68 | (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ |
69 | .magic = SPINLOCK_MAGIC, \ |
69 | .magic = SPINLOCK_MAGIC, \ |
70 | .owner = SPINLOCK_OWNER_INIT, \ |
70 | .owner = SPINLOCK_OWNER_INIT, \ |
71 | .owner_cpu = -1, \ |
71 | .owner_cpu = -1, \ |
72 | SPIN_DEP_MAP_INIT(lockname) } |
72 | SPIN_DEP_MAP_INIT(lockname) } |
73 | #define __RW_LOCK_UNLOCKED(lockname) \ |
73 | #define __RW_LOCK_UNLOCKED(lockname) \ |
74 | (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ |
74 | (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ |
75 | .magic = RWLOCK_MAGIC, \ |
75 | .magic = RWLOCK_MAGIC, \ |
76 | .owner = SPINLOCK_OWNER_INIT, \ |
76 | .owner = SPINLOCK_OWNER_INIT, \ |
77 | .owner_cpu = -1, \ |
77 | .owner_cpu = -1, \ |
78 | RW_DEP_MAP_INIT(lockname) } |
78 | RW_DEP_MAP_INIT(lockname) } |
79 | #else |
79 | #else |
80 | # define __SPIN_LOCK_UNLOCKED(lockname) \ |
80 | # define __SPIN_LOCK_UNLOCKED(lockname) \ |
81 | (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ |
81 | (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ |
82 | SPIN_DEP_MAP_INIT(lockname) } |
82 | SPIN_DEP_MAP_INIT(lockname) } |
83 | #define __RW_LOCK_UNLOCKED(lockname) \ |
83 | #define __RW_LOCK_UNLOCKED(lockname) \ |
84 | (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ |
84 | (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ |
85 | RW_DEP_MAP_INIT(lockname) } |
85 | RW_DEP_MAP_INIT(lockname) } |
86 | #endif |
86 | #endif |
87 | 87 | ||
88 | /* |
88 | /* |
89 | * SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and |
89 | * SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and |
90 | * are hence deprecated. |
90 | * are hence deprecated. |
91 | * Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or |
91 | * Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or |
92 | * __SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate. |
92 | * __SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate. |
93 | */ |
93 | */ |
94 | #define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init) |
94 | #define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init) |
95 | #define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init) |
95 | #define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init) |
96 | 96 | ||
97 | #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) |
97 | #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) |
98 | #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) |
98 | #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) |
99 | 99 | ||
100 | #endif /* __LINUX_SPINLOCK_TYPES_H */ |
100 | #endif /* __LINUX_SPINLOCK_TYPES_H */ |