0001 #ifndef __LINUX_SPINLOCK_TYPES_RAW_H
0002 #define __LINUX_SPINLOCK_TYPES_RAW_H
0003
0004 #include <linux/types.h>
0005
0006 #if defined(CONFIG_SMP)
0007 # include <asm/spinlock_types.h>
0008 #else
0009 # include <linux/spinlock_types_up.h>
0010 #endif
0011
0012 #include <linux/lockdep_types.h>
0013
0014 typedef struct raw_spinlock {
0015 arch_spinlock_t raw_lock;
0016 #ifdef CONFIG_DEBUG_SPINLOCK
0017 unsigned int magic, owner_cpu;
0018 void *owner;
0019 #endif
0020 #ifdef CONFIG_DEBUG_LOCK_ALLOC
0021 struct lockdep_map dep_map;
0022 #endif
0023 } raw_spinlock_t;
0024
0025 #define SPINLOCK_MAGIC 0xdead4ead
0026
0027 #define SPINLOCK_OWNER_INIT ((void *)-1L)
0028
0029 #ifdef CONFIG_DEBUG_LOCK_ALLOC
0030 # define RAW_SPIN_DEP_MAP_INIT(lockname) \
0031 .dep_map = { \
0032 .name = #lockname, \
0033 .wait_type_inner = LD_WAIT_SPIN, \
0034 }
0035 # define SPIN_DEP_MAP_INIT(lockname) \
0036 .dep_map = { \
0037 .name = #lockname, \
0038 .wait_type_inner = LD_WAIT_CONFIG, \
0039 }
0040
0041 # define LOCAL_SPIN_DEP_MAP_INIT(lockname) \
0042 .dep_map = { \
0043 .name = #lockname, \
0044 .wait_type_inner = LD_WAIT_CONFIG, \
0045 .lock_type = LD_LOCK_PERCPU, \
0046 }
0047 #else
0048 # define RAW_SPIN_DEP_MAP_INIT(lockname)
0049 # define SPIN_DEP_MAP_INIT(lockname)
0050 # define LOCAL_SPIN_DEP_MAP_INIT(lockname)
0051 #endif
0052
0053 #ifdef CONFIG_DEBUG_SPINLOCK
0054 # define SPIN_DEBUG_INIT(lockname) \
0055 .magic = SPINLOCK_MAGIC, \
0056 .owner_cpu = -1, \
0057 .owner = SPINLOCK_OWNER_INIT,
0058 #else
0059 # define SPIN_DEBUG_INIT(lockname)
0060 #endif
0061
0062 #define __RAW_SPIN_LOCK_INITIALIZER(lockname) \
0063 { \
0064 .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \
0065 SPIN_DEBUG_INIT(lockname) \
0066 RAW_SPIN_DEP_MAP_INIT(lockname) }
0067
0068 #define __RAW_SPIN_LOCK_UNLOCKED(lockname) \
0069 (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
0070
0071 #define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
0072
0073 #endif