diff options
author | Oleg Nesterov <oleg@redhat.com> | 2014-07-08 18:17:59 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-09-07 19:18:13 -0400 |
commit | 85b39d305bfe809a11ff2770d380be3e2465beec (patch) | |
tree | 2bc6f52c07779203329b0d791f631ab894a8846e /include/linux/rcupdate.h | |
parent | e02b2edfa13878c6671d31d5c736f56f89d99bf1 (diff) |
rcu: Uninline rcu_read_lock_held()
This commit uninlines rcu_read_lock_held(). According to "size vmlinux"
this saves 28549 in .text:
- 5541731 3014560 14757888 23314179
+ 5513182 3026848 14757888 23297918
Note: it looks as if the data grows by 12288 bytes but this is not true,
it does not actually grow. But .data starts with ALIGN(THREAD_SIZE) and
since .text shrinks the padding grows, and thus .data grows too as it
seen by /bin/size. diff System.map:
- ffffffff81510000 D _sdata
- ffffffff81510000 D init_thread_union
+ ffffffff81509000 D _sdata
+ ffffffff8150c000 D init_thread_union
Perhaps we can change vmlinux.lds.S to .data itself, so that /bin/size
can't "wrongly" report that .data grows if .text shinks.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'include/linux/rcupdate.h')
-rw-r--r-- | include/linux/rcupdate.h | 36 |
1 files changed, 1 insertions, 35 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 7e47e44bce03..321ed0d4e675 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -371,41 +371,7 @@ extern struct lockdep_map rcu_sched_lock_map; | |||
371 | extern struct lockdep_map rcu_callback_map; | 371 | extern struct lockdep_map rcu_callback_map; |
372 | int debug_lockdep_rcu_enabled(void); | 372 | int debug_lockdep_rcu_enabled(void); |
373 | 373 | ||
374 | /** | 374 | int rcu_read_lock_held(void); |
375 | * rcu_read_lock_held() - might we be in RCU read-side critical section? | ||
376 | * | ||
377 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU | ||
378 | * read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, | ||
379 | * this assumes we are in an RCU read-side critical section unless it can | ||
380 | * prove otherwise. This is useful for debug checks in functions that | ||
381 | * require that they be called within an RCU read-side critical section. | ||
382 | * | ||
383 | * Checks debug_lockdep_rcu_enabled() to prevent false positives during boot | ||
384 | * and while lockdep is disabled. | ||
385 | * | ||
386 | * Note that rcu_read_lock() and the matching rcu_read_unlock() must | ||
387 | * occur in the same context, for example, it is illegal to invoke | ||
388 | * rcu_read_unlock() in process context if the matching rcu_read_lock() | ||
389 | * was invoked from within an irq handler. | ||
390 | * | ||
391 | * Note that rcu_read_lock() is disallowed if the CPU is either idle or | ||
392 | * offline from an RCU perspective, so check for those as well. | ||
393 | */ | ||
394 | static inline int rcu_read_lock_held(void) | ||
395 | { | ||
396 | if (!debug_lockdep_rcu_enabled()) | ||
397 | return 1; | ||
398 | if (!rcu_is_watching()) | ||
399 | return 0; | ||
400 | if (!rcu_lockdep_current_cpu_online()) | ||
401 | return 0; | ||
402 | return lock_is_held(&rcu_lock_map); | ||
403 | } | ||
404 | |||
405 | /* | ||
406 | * rcu_read_lock_bh_held() is defined out of line to avoid #include-file | ||
407 | * hell. | ||
408 | */ | ||
409 | int rcu_read_lock_bh_held(void); | 375 | int rcu_read_lock_bh_held(void); |
410 | 376 | ||
411 | /** | 377 | /** |