diff options
Diffstat (limited to 'kernel/rcupdate.c')
-rw-r--r-- | kernel/rcupdate.c | 102 |
1 files changed, 1 insertions, 101 deletions
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index cce6ba8bbace..33eb4620aa17 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
@@ -212,43 +212,6 @@ static inline void debug_rcu_head_free(struct rcu_head *head) | |||
212 | } | 212 | } |
213 | 213 | ||
214 | /* | 214 | /* |
215 | * fixup_init is called when: | ||
216 | * - an active object is initialized | ||
217 | */ | ||
218 | static int rcuhead_fixup_init(void *addr, enum debug_obj_state state) | ||
219 | { | ||
220 | struct rcu_head *head = addr; | ||
221 | |||
222 | switch (state) { | ||
223 | case ODEBUG_STATE_ACTIVE: | ||
224 | /* | ||
225 | * Ensure that queued callbacks are all executed. | ||
226 | * If we detect that we are nested in a RCU read-side critical | ||
227 | * section, we should simply fail, otherwise we would deadlock. | ||
228 | * In !PREEMPT configurations, there is no way to tell if we are | ||
229 | * in a RCU read-side critical section or not, so we never | ||
230 | * attempt any fixup and just print a warning. | ||
231 | */ | ||
232 | #ifndef CONFIG_PREEMPT | ||
233 | WARN_ON_ONCE(1); | ||
234 | return 0; | ||
235 | #endif | ||
236 | if (rcu_preempt_depth() != 0 || preempt_count() != 0 || | ||
237 | irqs_disabled()) { | ||
238 | WARN_ON_ONCE(1); | ||
239 | return 0; | ||
240 | } | ||
241 | rcu_barrier(); | ||
242 | rcu_barrier_sched(); | ||
243 | rcu_barrier_bh(); | ||
244 | debug_object_init(head, &rcuhead_debug_descr); | ||
245 | return 1; | ||
246 | default: | ||
247 | return 0; | ||
248 | } | ||
249 | } | ||
250 | |||
251 | /* | ||
252 | * fixup_activate is called when: | 215 | * fixup_activate is called when: |
253 | * - an active object is activated | 216 | * - an active object is activated |
254 | * - an unknown object is activated (might be a statically initialized object) | 217 | * - an unknown object is activated (might be a statically initialized object) |
@@ -268,69 +231,8 @@ static int rcuhead_fixup_activate(void *addr, enum debug_obj_state state) | |||
268 | debug_object_init(head, &rcuhead_debug_descr); | 231 | debug_object_init(head, &rcuhead_debug_descr); |
269 | debug_object_activate(head, &rcuhead_debug_descr); | 232 | debug_object_activate(head, &rcuhead_debug_descr); |
270 | return 0; | 233 | return 0; |
271 | |||
272 | case ODEBUG_STATE_ACTIVE: | ||
273 | /* | ||
274 | * Ensure that queued callbacks are all executed. | ||
275 | * If we detect that we are nested in a RCU read-side critical | ||
276 | * section, we should simply fail, otherwise we would deadlock. | ||
277 | * In !PREEMPT configurations, there is no way to tell if we are | ||
278 | * in a RCU read-side critical section or not, so we never | ||
279 | * attempt any fixup and just print a warning. | ||
280 | */ | ||
281 | #ifndef CONFIG_PREEMPT | ||
282 | WARN_ON_ONCE(1); | ||
283 | return 0; | ||
284 | #endif | ||
285 | if (rcu_preempt_depth() != 0 || preempt_count() != 0 || | ||
286 | irqs_disabled()) { | ||
287 | WARN_ON_ONCE(1); | ||
288 | return 0; | ||
289 | } | ||
290 | rcu_barrier(); | ||
291 | rcu_barrier_sched(); | ||
292 | rcu_barrier_bh(); | ||
293 | debug_object_activate(head, &rcuhead_debug_descr); | ||
294 | return 1; | ||
295 | default: | 234 | default: |
296 | return 0; | ||
297 | } | ||
298 | } | ||
299 | |||
300 | /* | ||
301 | * fixup_free is called when: | ||
302 | * - an active object is freed | ||
303 | */ | ||
304 | static int rcuhead_fixup_free(void *addr, enum debug_obj_state state) | ||
305 | { | ||
306 | struct rcu_head *head = addr; | ||
307 | |||
308 | switch (state) { | ||
309 | case ODEBUG_STATE_ACTIVE: | ||
310 | /* | ||
311 | * Ensure that queued callbacks are all executed. | ||
312 | * If we detect that we are nested in a RCU read-side critical | ||
313 | * section, we should simply fail, otherwise we would deadlock. | ||
314 | * In !PREEMPT configurations, there is no way to tell if we are | ||
315 | * in a RCU read-side critical section or not, so we never | ||
316 | * attempt any fixup and just print a warning. | ||
317 | */ | ||
318 | #ifndef CONFIG_PREEMPT | ||
319 | WARN_ON_ONCE(1); | ||
320 | return 0; | ||
321 | #endif | ||
322 | if (rcu_preempt_depth() != 0 || preempt_count() != 0 || | ||
323 | irqs_disabled()) { | ||
324 | WARN_ON_ONCE(1); | ||
325 | return 0; | ||
326 | } | ||
327 | rcu_barrier(); | ||
328 | rcu_barrier_sched(); | ||
329 | rcu_barrier_bh(); | ||
330 | debug_object_free(head, &rcuhead_debug_descr); | ||
331 | return 1; | 235 | return 1; |
332 | default: | ||
333 | return 0; | ||
334 | } | 236 | } |
335 | } | 237 | } |
336 | 238 | ||
@@ -369,15 +271,13 @@ EXPORT_SYMBOL_GPL(destroy_rcu_head_on_stack); | |||
369 | 271 | ||
370 | struct debug_obj_descr rcuhead_debug_descr = { | 272 | struct debug_obj_descr rcuhead_debug_descr = { |
371 | .name = "rcu_head", | 273 | .name = "rcu_head", |
372 | .fixup_init = rcuhead_fixup_init, | ||
373 | .fixup_activate = rcuhead_fixup_activate, | 274 | .fixup_activate = rcuhead_fixup_activate, |
374 | .fixup_free = rcuhead_fixup_free, | ||
375 | }; | 275 | }; |
376 | EXPORT_SYMBOL_GPL(rcuhead_debug_descr); | 276 | EXPORT_SYMBOL_GPL(rcuhead_debug_descr); |
377 | #endif /* #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | 277 | #endif /* #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD */ |
378 | 278 | ||
379 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) || defined(CONFIG_RCU_TRACE) | 279 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) || defined(CONFIG_RCU_TRACE) |
380 | void do_trace_rcu_torture_read(char *rcutorturename, struct rcu_head *rhp, | 280 | void do_trace_rcu_torture_read(const char *rcutorturename, struct rcu_head *rhp, |
381 | unsigned long secs, | 281 | unsigned long secs, |
382 | unsigned long c_old, unsigned long c) | 282 | unsigned long c_old, unsigned long c) |
383 | { | 283 | { |