hc
2024-08-13 f258bb3ae540ccc311fd344a0121bba1928b85dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifndef __LINUX_SPINLOCK_TYPES_H
#define __LINUX_SPINLOCK_TYPES_H
 
/*
 * include/linux/spinlock_types.h - generic spinlock type definitions
 *                                  and initializers
 *
 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
 * Released under the General Public License (GPL).
 */
 
#if defined(CONFIG_SMP)
# include <asm/spinlock_types.h>
#else
# include <linux/spinlock_types_up.h>
#endif
 
#include <linux/lockdep_types.h>
 
typedef struct raw_spinlock {
   arch_spinlock_t raw_lock;
#ifdef CONFIG_DEBUG_SPINLOCK
   unsigned int magic, owner_cpu;
   void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
   struct lockdep_map dep_map;
#endif
} raw_spinlock_t;
 
#define SPINLOCK_MAGIC        0xdead4ead
 
#define SPINLOCK_OWNER_INIT    ((void *)-1L)
 
#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define RAW_SPIN_DEP_MAP_INIT(lockname)        \
   .dep_map = {                    \
       .name = #lockname,            \
       .wait_type_inner = LD_WAIT_SPIN,    \
   }
# define SPIN_DEP_MAP_INIT(lockname)            \
   .dep_map = {                    \
       .name = #lockname,            \
       .wait_type_inner = LD_WAIT_CONFIG,    \
   }
#else
# define RAW_SPIN_DEP_MAP_INIT(lockname)
# define SPIN_DEP_MAP_INIT(lockname)
#endif
 
#ifdef CONFIG_DEBUG_SPINLOCK
# define SPIN_DEBUG_INIT(lockname)        \
   .magic = SPINLOCK_MAGIC,        \
   .owner_cpu = -1,            \
   .owner = SPINLOCK_OWNER_INIT,
#else
# define SPIN_DEBUG_INIT(lockname)
#endif
 
#define __RAW_SPIN_LOCK_INITIALIZER(lockname)    \
   {                    \
   .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED,    \
   SPIN_DEBUG_INIT(lockname)        \
   RAW_SPIN_DEP_MAP_INIT(lockname) }
 
#define __RAW_SPIN_LOCK_UNLOCKED(lockname)    \
   (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
 
#define DEFINE_RAW_SPINLOCK(x)    raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
 
typedef struct spinlock {
   union {
       struct raw_spinlock rlock;
 
#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
       struct {
           u8 __padding[LOCK_PADSIZE];
           struct lockdep_map dep_map;
       };
#endif
   };
} spinlock_t;
 
#define ___SPIN_LOCK_INITIALIZER(lockname)    \
   {                    \
   .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED,    \
   SPIN_DEBUG_INIT(lockname)        \
   SPIN_DEP_MAP_INIT(lockname) }
 
#define __SPIN_LOCK_INITIALIZER(lockname) \
   { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } }
 
#define __SPIN_LOCK_UNLOCKED(lockname) \
   (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname)
 
#define DEFINE_SPINLOCK(x)    spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
 
#include <linux/rwlock_types.h>
 
#endif /* __LINUX_SPINLOCK_TYPES_H */