diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2009-08-22 16:56:53 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-08-23 04:32:40 -0400 |
commit | 6b3ef48adf847f7adf11c870e3ffacac150f1564 (patch) | |
tree | e1403ce515bf00ade99ec806f6ab6b6db999aa0b /include | |
parent | f41d911f8c49a5d65c86504c19e8204bb605c4fd (diff) |
rcu: Remove CONFIG_PREEMPT_RCU
Now that CONFIG_TREE_PREEMPT_RCU is in place, there is no
further need for CONFIG_PREEMPT_RCU. Remove it, along with
whatever subtle bugs it may (or may not) contain.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: akpm@linux-foundation.org
Cc: mathieu.desnoyers@polymtl.ca
Cc: josht@linux.vnet.ibm.com
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
LKML-Reference: <125097461396-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/init_task.h | 6 | ||||
-rw-r--r-- | include/linux/rcupdate.h | 4 | ||||
-rw-r--r-- | include/linux/rcupreempt.h | 140 | ||||
-rw-r--r-- | include/linux/rcupreempt_trace.h | 97 | ||||
-rw-r--r-- | include/linux/sched.h | 13 |
5 files changed, 2 insertions, 258 deletions
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 971a968831bf..79d4baee31b6 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -94,11 +94,7 @@ extern struct group_info init_groups; | |||
94 | # define CAP_INIT_BSET CAP_INIT_EFF_SET | 94 | # define CAP_INIT_BSET CAP_INIT_EFF_SET |
95 | #endif | 95 | #endif |
96 | 96 | ||
97 | #ifdef CONFIG_PREEMPT_RCU | 97 | #ifdef CONFIG_TREE_PREEMPT_RCU |
98 | #define INIT_TASK_RCU_PREEMPT(tsk) \ | ||
99 | .rcu_read_lock_nesting = 0, \ | ||
100 | .rcu_flipctr_idx = 0, | ||
101 | #elif defined(CONFIG_TREE_PREEMPT_RCU) | ||
102 | #define INIT_TASK_RCU_PREEMPT(tsk) \ | 98 | #define INIT_TASK_RCU_PREEMPT(tsk) \ |
103 | .rcu_read_lock_nesting = 0, \ | 99 | .rcu_read_lock_nesting = 0, \ |
104 | .rcu_read_unlock_special = 0, \ | 100 | .rcu_read_unlock_special = 0, \ |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 26892f5e7bd8..ec90fc34fea9 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -68,11 +68,9 @@ extern int rcu_scheduler_active; | |||
68 | 68 | ||
69 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) | 69 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) |
70 | #include <linux/rcutree.h> | 70 | #include <linux/rcutree.h> |
71 | #elif defined(CONFIG_PREEMPT_RCU) | ||
72 | #include <linux/rcupreempt.h> | ||
73 | #else | 71 | #else |
74 | #error "Unknown RCU implementation specified to kernel configuration" | 72 | #error "Unknown RCU implementation specified to kernel configuration" |
75 | #endif /* #else #if defined(CONFIG_CLASSIC_RCU) */ | 73 | #endif |
76 | 74 | ||
77 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } | 75 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } |
78 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT | 76 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT |
diff --git a/include/linux/rcupreempt.h b/include/linux/rcupreempt.h deleted file mode 100644 index a42ab88e9210..000000000000 --- a/include/linux/rcupreempt.h +++ /dev/null | |||
@@ -1,140 +0,0 @@ | |||
1 | /* | ||
2 | * Read-Copy Update mechanism for mutual exclusion (RT implementation) | ||
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 (C) IBM Corporation, 2006 | ||
19 | * | ||
20 | * Author: Paul McKenney <paulmck@us.ibm.com> | ||
21 | * | ||
22 | * Based on the original work by Paul McKenney <paul.mckenney@us.ibm.com> | ||
23 | * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. | ||
24 | * Papers: | ||
25 | * http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf | ||
26 | * http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) | ||
27 | * | ||
28 | * For detailed explanation of Read-Copy Update mechanism see - | ||
29 | * Documentation/RCU | ||
30 | * | ||
31 | */ | ||
32 | |||
33 | #ifndef __LINUX_RCUPREEMPT_H | ||
34 | #define __LINUX_RCUPREEMPT_H | ||
35 | |||
36 | #include <linux/cache.h> | ||
37 | #include <linux/spinlock.h> | ||
38 | #include <linux/threads.h> | ||
39 | #include <linux/smp.h> | ||
40 | #include <linux/cpumask.h> | ||
41 | #include <linux/seqlock.h> | ||
42 | |||
43 | extern void rcu_sched_qs(int cpu); | ||
44 | static inline void rcu_bh_qs(int cpu) { } | ||
45 | |||
46 | /* | ||
47 | * Someone might want to pass call_rcu_bh as a function pointer. | ||
48 | * So this needs to just be a rename and not a macro function. | ||
49 | * (no parentheses) | ||
50 | */ | ||
51 | #define call_rcu_bh call_rcu | ||
52 | |||
53 | /** | ||
54 | * call_rcu_sched - Queue RCU callback for invocation after sched grace period. | ||
55 | * @head: structure to be used for queueing the RCU updates. | ||
56 | * @func: actual update function to be invoked after the grace period | ||
57 | * | ||
58 | * The update function will be invoked some time after a full | ||
59 | * synchronize_sched()-style grace period elapses, in other words after | ||
60 | * all currently executing preempt-disabled sections of code (including | ||
61 | * hardirq handlers, NMI handlers, and local_irq_save() blocks) have | ||
62 | * completed. | ||
63 | */ | ||
64 | extern void call_rcu_sched(struct rcu_head *head, | ||
65 | void (*func)(struct rcu_head *head)); | ||
66 | |||
67 | extern void __rcu_read_lock(void); | ||
68 | extern void __rcu_read_unlock(void); | ||
69 | extern int rcu_needs_cpu(int cpu); | ||
70 | |||
71 | #define __rcu_read_lock_bh() { rcu_read_lock(); local_bh_disable(); } | ||
72 | #define __rcu_read_unlock_bh() { local_bh_enable(); rcu_read_unlock(); } | ||
73 | |||
74 | extern void __synchronize_sched(void); | ||
75 | |||
76 | static inline void synchronize_rcu_expedited(void) | ||
77 | { | ||
78 | synchronize_rcu(); /* Placeholder for new rcupreempt implementation. */ | ||
79 | } | ||
80 | |||
81 | static inline void synchronize_rcu_bh_expedited(void) | ||
82 | { | ||
83 | synchronize_rcu_bh(); /* Placeholder for new rcupreempt impl. */ | ||
84 | } | ||
85 | |||
86 | extern void __rcu_init(void); | ||
87 | extern void rcu_init_sched(void); | ||
88 | extern void rcu_check_callbacks(int cpu, int user); | ||
89 | extern void rcu_restart_cpu(int cpu); | ||
90 | extern long rcu_batches_completed(void); | ||
91 | |||
92 | /* | ||
93 | * Return the number of RCU batches processed thus far. Useful for debug | ||
94 | * and statistic. The _bh variant is identifcal to straight RCU | ||
95 | */ | ||
96 | static inline long rcu_batches_completed_bh(void) | ||
97 | { | ||
98 | return rcu_batches_completed(); | ||
99 | } | ||
100 | |||
101 | static inline void exit_rcu(void) | ||
102 | { | ||
103 | } | ||
104 | |||
105 | #ifdef CONFIG_RCU_TRACE | ||
106 | struct rcupreempt_trace; | ||
107 | extern long *rcupreempt_flipctr(int cpu); | ||
108 | extern long rcupreempt_data_completed(void); | ||
109 | extern int rcupreempt_flip_flag(int cpu); | ||
110 | extern int rcupreempt_mb_flag(int cpu); | ||
111 | extern char *rcupreempt_try_flip_state_name(void); | ||
112 | extern struct rcupreempt_trace *rcupreempt_trace_cpu(int cpu); | ||
113 | #endif | ||
114 | |||
115 | struct softirq_action; | ||
116 | |||
117 | #ifdef CONFIG_NO_HZ | ||
118 | extern void rcu_enter_nohz(void); | ||
119 | extern void rcu_exit_nohz(void); | ||
120 | #else | ||
121 | # define rcu_enter_nohz() do { } while (0) | ||
122 | # define rcu_exit_nohz() do { } while (0) | ||
123 | #endif | ||
124 | |||
125 | /* | ||
126 | * A context switch is a grace period for rcupreempt synchronize_rcu() | ||
127 | * only during early boot, before the scheduler has been initialized. | ||
128 | * So, how the heck do we get a context switch? Well, if the caller | ||
129 | * invokes synchronize_rcu(), they are willing to accept a context | ||
130 | * switch, so we simply pretend that one happened. | ||
131 | * | ||
132 | * After boot, there might be a blocked or preempted task in an RCU | ||
133 | * read-side critical section, so we cannot then take the fastpath. | ||
134 | */ | ||
135 | static inline int rcu_blocking_is_gp(void) | ||
136 | { | ||
137 | return num_online_cpus() == 1 && !rcu_scheduler_active; | ||
138 | } | ||
139 | |||
140 | #endif /* __LINUX_RCUPREEMPT_H */ | ||
diff --git a/include/linux/rcupreempt_trace.h b/include/linux/rcupreempt_trace.h deleted file mode 100644 index b99ae073192a..000000000000 --- a/include/linux/rcupreempt_trace.h +++ /dev/null | |||
@@ -1,97 +0,0 @@ | |||
1 | /* | ||
2 | * Read-Copy Update mechanism for mutual exclusion (RT implementation) | ||
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 (C) IBM Corporation, 2006 | ||
19 | * | ||
20 | * Author: Paul McKenney <paulmck@us.ibm.com> | ||
21 | * | ||
22 | * Based on the original work by Paul McKenney <paul.mckenney@us.ibm.com> | ||
23 | * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. | ||
24 | * Papers: | ||
25 | * http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf | ||
26 | * http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) | ||
27 | * | ||
28 | * For detailed explanation of the Preemptible Read-Copy Update mechanism see - | ||
29 | * http://lwn.net/Articles/253651/ | ||
30 | */ | ||
31 | |||
32 | #ifndef __LINUX_RCUPREEMPT_TRACE_H | ||
33 | #define __LINUX_RCUPREEMPT_TRACE_H | ||
34 | |||
35 | #include <linux/types.h> | ||
36 | #include <linux/kernel.h> | ||
37 | |||
38 | #include <asm/atomic.h> | ||
39 | |||
40 | /* | ||
41 | * PREEMPT_RCU data structures. | ||
42 | */ | ||
43 | |||
44 | struct rcupreempt_trace { | ||
45 | long next_length; | ||
46 | long next_add; | ||
47 | long wait_length; | ||
48 | long wait_add; | ||
49 | long done_length; | ||
50 | long done_add; | ||
51 | long done_remove; | ||
52 | atomic_t done_invoked; | ||
53 | long rcu_check_callbacks; | ||
54 | atomic_t rcu_try_flip_1; | ||
55 | atomic_t rcu_try_flip_e1; | ||
56 | long rcu_try_flip_i1; | ||
57 | long rcu_try_flip_ie1; | ||
58 | long rcu_try_flip_g1; | ||
59 | long rcu_try_flip_a1; | ||
60 | long rcu_try_flip_ae1; | ||
61 | long rcu_try_flip_a2; | ||
62 | long rcu_try_flip_z1; | ||
63 | long rcu_try_flip_ze1; | ||
64 | long rcu_try_flip_z2; | ||
65 | long rcu_try_flip_m1; | ||
66 | long rcu_try_flip_me1; | ||
67 | long rcu_try_flip_m2; | ||
68 | }; | ||
69 | |||
70 | #ifdef CONFIG_RCU_TRACE | ||
71 | #define RCU_TRACE(fn, arg) fn(arg); | ||
72 | #else | ||
73 | #define RCU_TRACE(fn, arg) | ||
74 | #endif | ||
75 | |||
76 | extern void rcupreempt_trace_move2done(struct rcupreempt_trace *trace); | ||
77 | extern void rcupreempt_trace_move2wait(struct rcupreempt_trace *trace); | ||
78 | extern void rcupreempt_trace_try_flip_1(struct rcupreempt_trace *trace); | ||
79 | extern void rcupreempt_trace_try_flip_e1(struct rcupreempt_trace *trace); | ||
80 | extern void rcupreempt_trace_try_flip_i1(struct rcupreempt_trace *trace); | ||
81 | extern void rcupreempt_trace_try_flip_ie1(struct rcupreempt_trace *trace); | ||
82 | extern void rcupreempt_trace_try_flip_g1(struct rcupreempt_trace *trace); | ||
83 | extern void rcupreempt_trace_try_flip_a1(struct rcupreempt_trace *trace); | ||
84 | extern void rcupreempt_trace_try_flip_ae1(struct rcupreempt_trace *trace); | ||
85 | extern void rcupreempt_trace_try_flip_a2(struct rcupreempt_trace *trace); | ||
86 | extern void rcupreempt_trace_try_flip_z1(struct rcupreempt_trace *trace); | ||
87 | extern void rcupreempt_trace_try_flip_ze1(struct rcupreempt_trace *trace); | ||
88 | extern void rcupreempt_trace_try_flip_z2(struct rcupreempt_trace *trace); | ||
89 | extern void rcupreempt_trace_try_flip_m1(struct rcupreempt_trace *trace); | ||
90 | extern void rcupreempt_trace_try_flip_me1(struct rcupreempt_trace *trace); | ||
91 | extern void rcupreempt_trace_try_flip_m2(struct rcupreempt_trace *trace); | ||
92 | extern void rcupreempt_trace_check_callbacks(struct rcupreempt_trace *trace); | ||
93 | extern void rcupreempt_trace_done_remove(struct rcupreempt_trace *trace); | ||
94 | extern void rcupreempt_trace_invoke(struct rcupreempt_trace *trace); | ||
95 | extern void rcupreempt_trace_next_add(struct rcupreempt_trace *trace); | ||
96 | |||
97 | #endif /* __LINUX_RCUPREEMPT_TRACE_H */ | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index d7f98f637a2a..bfca26d63b13 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1205,11 +1205,6 @@ struct task_struct { | |||
1205 | unsigned int policy; | 1205 | unsigned int policy; |
1206 | cpumask_t cpus_allowed; | 1206 | cpumask_t cpus_allowed; |
1207 | 1207 | ||
1208 | #ifdef CONFIG_PREEMPT_RCU | ||
1209 | int rcu_read_lock_nesting; | ||
1210 | int rcu_flipctr_idx; | ||
1211 | #endif /* #ifdef CONFIG_PREEMPT_RCU */ | ||
1212 | |||
1213 | #ifdef CONFIG_TREE_PREEMPT_RCU | 1208 | #ifdef CONFIG_TREE_PREEMPT_RCU |
1214 | int rcu_read_lock_nesting; | 1209 | int rcu_read_lock_nesting; |
1215 | char rcu_read_unlock_special; | 1210 | char rcu_read_unlock_special; |
@@ -1744,14 +1739,6 @@ static inline void rcu_copy_process(struct task_struct *p) | |||
1744 | INIT_LIST_HEAD(&p->rcu_node_entry); | 1739 | INIT_LIST_HEAD(&p->rcu_node_entry); |
1745 | } | 1740 | } |
1746 | 1741 | ||
1747 | #elif defined(CONFIG_PREEMPT_RCU) | ||
1748 | |||
1749 | static inline void rcu_copy_process(struct task_struct *p) | ||
1750 | { | ||
1751 | p->rcu_read_lock_nesting = 0; | ||
1752 | p->rcu_flipctr_idx = 0; | ||
1753 | } | ||
1754 | |||
1755 | #else | 1742 | #else |
1756 | 1743 | ||
1757 | static inline void rcu_copy_process(struct task_struct *p) | 1744 | static inline void rcu_copy_process(struct task_struct *p) |