Line data Source code
1 : /*
2 : * Read-Copy Update mechanism for mutual exclusion (tree-based version)
3 : *
4 : * This program is free software; you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation; either version 2 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * This program is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with this program; if not, write to the Free Software
16 : * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 : *
18 : * Copyright IBM Corporation, 2008
19 : *
20 : * Author: Dipankar Sarma <dipankar@in.ibm.com>
21 : * Paul E. McKenney <paulmck@linux.vnet.ibm.com> Hierarchical algorithm
22 : *
23 : * Based on the original work by Paul McKenney <paulmck@us.ibm.com>
24 : * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen.
25 : *
26 : * For detailed explanation of Read-Copy Update mechanism see -
27 : * Documentation/RCU
28 : */
29 :
30 : #ifndef __LINUX_RCUTREE_H
31 : #define __LINUX_RCUTREE_H
32 :
33 : struct notifier_block;
34 :
35 : extern void rcu_sched_qs(int cpu);
36 : extern void rcu_bh_qs(int cpu);
37 : extern int rcu_needs_cpu(int cpu);
38 : extern void rcu_scheduler_starting(void);
39 : extern int rcu_expedited_torture_stats(char *page);
40 :
41 : #ifdef CONFIG_TREE_PREEMPT_RCU
42 :
43 : extern void __rcu_read_lock(void);
44 : extern void __rcu_read_unlock(void);
45 : extern void synchronize_rcu(void);
46 : extern void exit_rcu(void);
47 :
48 : /*
49 : * Defined as macro as it is a very low level header
50 : * included from areas that don't even know about current
51 : */
52 : #define rcu_preempt_depth() (current->rcu_read_lock_nesting)
53 :
54 : #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */
55 :
56 : static inline void __rcu_read_lock(void)
57 : {
58 8 : preempt_disable();
59 : }
60 :
61 : static inline void __rcu_read_unlock(void)
62 : {
63 : preempt_enable();
64 : }
65 :
66 : #define synchronize_rcu synchronize_sched
67 :
68 : static inline void exit_rcu(void)
69 : {
70 : }
71 :
72 : static inline int rcu_preempt_depth(void)
73 : {
74 : return 0;
75 : }
76 :
77 : #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */
78 :
79 : static inline void __rcu_read_lock_bh(void)
80 : {
81 : local_bh_disable();
82 : }
83 : static inline void __rcu_read_unlock_bh(void)
84 : {
85 : local_bh_enable();
86 : }
87 :
88 : extern void call_rcu_sched(struct rcu_head *head,
89 : void (*func)(struct rcu_head *rcu));
90 : extern void synchronize_rcu_expedited(void);
91 :
92 : static inline void synchronize_rcu_bh_expedited(void)
93 : {
94 : synchronize_sched_expedited();
95 : }
96 :
97 : extern void rcu_check_callbacks(int cpu, int user);
98 :
99 : extern long rcu_batches_completed(void);
100 : extern long rcu_batches_completed_bh(void);
101 : extern long rcu_batches_completed_sched(void);
102 :
103 : #ifdef CONFIG_NO_HZ
104 : void rcu_enter_nohz(void);
105 : void rcu_exit_nohz(void);
106 : #else /* CONFIG_NO_HZ */
107 : static inline void rcu_enter_nohz(void)
108 : {
109 : }
110 : static inline void rcu_exit_nohz(void)
111 : {
112 : }
113 : #endif /* CONFIG_NO_HZ */
114 :
115 : /* A context switch is a grace period for RCU-sched and RCU-bh. */
116 : static inline int rcu_blocking_is_gp(void)
117 : {
118 : return num_online_cpus() == 1;
119 : }
120 :
121 : #endif /* __LINUX_RCUTREE_H */
|