1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef _LINUX_RCU_SYNC_H_
24#define _LINUX_RCU_SYNC_H_
25
26#include <linux/wait.h>
27#include <linux/rcupdate.h>
28
29enum rcu_sync_type { RCU_SYNC, RCU_SCHED_SYNC, RCU_BH_SYNC };
30
31
32struct rcu_sync {
33 int gp_state;
34 int gp_count;
35 wait_queue_head_t gp_wait;
36
37 int cb_state;
38 struct rcu_head cb_head;
39
40 enum rcu_sync_type gp_type;
41};
42
43extern void rcu_sync_lockdep_assert(struct rcu_sync *);
44
45
46
47
48
49
50
51
52
53static inline bool rcu_sync_is_idle(struct rcu_sync *rsp)
54{
55#ifdef CONFIG_PROVE_RCU
56 rcu_sync_lockdep_assert(rsp);
57#endif
58 return !rsp->gp_state;
59}
60
61extern void rcu_sync_init(struct rcu_sync *, enum rcu_sync_type);
62extern void rcu_sync_enter_start(struct rcu_sync *);
63extern void rcu_sync_enter(struct rcu_sync *);
64extern void rcu_sync_exit(struct rcu_sync *);
65extern void rcu_sync_dtor(struct rcu_sync *);
66
67#define __RCU_SYNC_INITIALIZER(name, type) { \
68 .gp_state = 0, \
69 .gp_count = 0, \
70 .gp_wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.gp_wait), \
71 .cb_state = 0, \
72 .gp_type = type, \
73 }
74
75#define __DEFINE_RCU_SYNC(name, type) \
76 struct rcu_sync_struct name = __RCU_SYNC_INITIALIZER(name, type)
77
78#define DEFINE_RCU_SYNC(name) \
79 __DEFINE_RCU_SYNC(name, RCU_SYNC)
80
81#define DEFINE_RCU_SCHED_SYNC(name) \
82 __DEFINE_RCU_SYNC(name, RCU_SCHED_SYNC)
83
84#define DEFINE_RCU_BH_SYNC(name) \
85 __DEFINE_RCU_SYNC(name, RCU_BH_SYNC)
86
87#endif
88