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