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#include <linux/lockdep.h>
13
14#if defined(CONFIG_SMP)
15# include <asm/spinlock_types.h>
16#else
17# include <linux/spinlock_types_up.h>
18#endif
19
20typedef struct {
21	raw_spinlock_t raw_lock;
22#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
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
36typedef struct {
37	raw_rwlock_t raw_lock;
38#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
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 */
101