]>
Commit | Line | Data |
---|---|---|
fb1c8f93 IM |
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 | ||
21f8ca3b PZ |
18 | #include <linux/lockdep.h> |
19 | ||
c2f21ce2 | 20 | typedef struct raw_spinlock { |
445c8951 | 21 | arch_spinlock_t raw_lock; |
95c354fe | 22 | #ifdef CONFIG_GENERIC_LOCKBREAK |
fb1c8f93 IM |
23 | unsigned int break_lock; |
24 | #endif | |
25 | #ifdef CONFIG_DEBUG_SPINLOCK | |
26 | unsigned int magic, owner_cpu; | |
27 | void *owner; | |
28 | #endif | |
8a25d5de IM |
29 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
30 | struct lockdep_map dep_map; | |
31 | #endif | |
c2f21ce2 | 32 | } raw_spinlock_t; |
fb1c8f93 IM |
33 | |
34 | #define SPINLOCK_MAGIC 0xdead4ead | |
35 | ||
fb1c8f93 IM |
36 | #define SPINLOCK_OWNER_INIT ((void *)-1L) |
37 | ||
8a25d5de IM |
38 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
39 | # define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } | |
40 | #else | |
41 | # define SPIN_DEP_MAP_INIT(lockname) | |
42 | #endif | |
43 | ||
fb1c8f93 | 44 | #ifdef CONFIG_DEBUG_SPINLOCK |
c2f21ce2 TG |
45 | # define SPIN_DEBUG_INIT(lockname) \ |
46 | .magic = SPINLOCK_MAGIC, \ | |
47 | .owner_cpu = -1, \ | |
48 | .owner = SPINLOCK_OWNER_INIT, | |
fb1c8f93 | 49 | #else |
c2f21ce2 | 50 | # define SPIN_DEBUG_INIT(lockname) |
fb1c8f93 IM |
51 | #endif |
52 | ||
c2f21ce2 TG |
53 | #define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ |
54 | { \ | |
55 | .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ | |
56 | SPIN_DEBUG_INIT(lockname) \ | |
57 | SPIN_DEP_MAP_INIT(lockname) } | |
58 | ||
59 | #define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ | |
60 | (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) | |
61 | ||
62 | #define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) | |
63 | ||
64 | typedef struct spinlock { | |
65 | union { | |
66 | struct raw_spinlock rlock; | |
67 | ||
68 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | |
69 | # define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) | |
70 | struct { | |
71 | u8 __padding[LOCK_PADSIZE]; | |
72 | struct lockdep_map dep_map; | |
73 | }; | |
74 | #endif | |
75 | }; | |
76 | } spinlock_t; | |
77 | ||
78 | #define __SPIN_LOCK_INITIALIZER(lockname) \ | |
79 | { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } | |
80 | ||
81 | #define __SPIN_LOCK_UNLOCKED(lockname) \ | |
82 | (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) | |
83 | ||
e4d91918 | 84 | #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) |
ef12f109 TG |
85 | |
86 | #include <linux/rwlock_types.h> | |
fb1c8f93 IM |
87 | |
88 | #endif /* __LINUX_SPINLOCK_TYPES_H */ |