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(struct rcu_sync *);
63extern void rcu_sync_exit(struct rcu_sync *);
64extern void rcu_sync_dtor(struct rcu_sync *);
65
66#define __RCU_SYNC_INITIALIZER(name, type) { \
67 .gp_state = 0, \
68 .gp_count = 0, \
69 .gp_wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.gp_wait), \
70 .cb_state = 0, \
71 .gp_type = type, \
72 }
73
74#define __DEFINE_RCU_SYNC(name, type) \
75 struct rcu_sync_struct name = __RCU_SYNC_INITIALIZER(name, type)
76
77#define DEFINE_RCU_SYNC(name) \
78 __DEFINE_RCU_SYNC(name, RCU_SYNC)
79
80#define DEFINE_RCU_SCHED_SYNC(name) \
81 __DEFINE_RCU_SYNC(name, RCU_SCHED_SYNC)
82
83#define DEFINE_RCU_BH_SYNC(name) \
84 __DEFINE_RCU_SYNC(name, RCU_BH_SYNC)
85
86#endif
87