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>
This commit is contained in:
parent
e02b2edfa1
commit
85b39d305b
|
@ -371,41 +371,7 @@ extern struct lockdep_map rcu_sched_lock_map;
|
||||||
extern struct lockdep_map rcu_callback_map;
|
extern struct lockdep_map rcu_callback_map;
|
||||||
int debug_lockdep_rcu_enabled(void);
|
int debug_lockdep_rcu_enabled(void);
|
||||||
|
|
||||||
/**
|
int rcu_read_lock_held(void);
|
||||||
* rcu_read_lock_held() - might we be in RCU read-side critical section?
|
|
||||||
*
|
|
||||||
* If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU
|
|
||||||
* read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC,
|
|
||||||
* this assumes we are in an RCU read-side critical section unless it can
|
|
||||||
* prove otherwise. This is useful for debug checks in functions that
|
|
||||||
* require that they be called within an RCU read-side critical section.
|
|
||||||
*
|
|
||||||
* Checks debug_lockdep_rcu_enabled() to prevent false positives during boot
|
|
||||||
* and while lockdep is disabled.
|
|
||||||
*
|
|
||||||
* Note that rcu_read_lock() and the matching rcu_read_unlock() must
|
|
||||||
* occur in the same context, for example, it is illegal to invoke
|
|
||||||
* rcu_read_unlock() in process context if the matching rcu_read_lock()
|
|
||||||
* was invoked from within an irq handler.
|
|
||||||
*
|
|
||||||
* Note that rcu_read_lock() is disallowed if the CPU is either idle or
|
|
||||||
* offline from an RCU perspective, so check for those as well.
|
|
||||||
*/
|
|
||||||
static inline int rcu_read_lock_held(void)
|
|
||||||
{
|
|
||||||
if (!debug_lockdep_rcu_enabled())
|
|
||||||
return 1;
|
|
||||||
if (!rcu_is_watching())
|
|
||||||
return 0;
|
|
||||||
if (!rcu_lockdep_current_cpu_online())
|
|
||||||
return 0;
|
|
||||||
return lock_is_held(&rcu_lock_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* rcu_read_lock_bh_held() is defined out of line to avoid #include-file
|
|
||||||
* hell.
|
|
||||||
*/
|
|
||||||
int rcu_read_lock_bh_held(void);
|
int rcu_read_lock_bh_held(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -136,6 +136,38 @@ int notrace debug_lockdep_rcu_enabled(void)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled);
|
EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rcu_read_lock_held() - might we be in RCU read-side critical section?
|
||||||
|
*
|
||||||
|
* If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU
|
||||||
|
* read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC,
|
||||||
|
* this assumes we are in an RCU read-side critical section unless it can
|
||||||
|
* prove otherwise. This is useful for debug checks in functions that
|
||||||
|
* require that they be called within an RCU read-side critical section.
|
||||||
|
*
|
||||||
|
* Checks debug_lockdep_rcu_enabled() to prevent false positives during boot
|
||||||
|
* and while lockdep is disabled.
|
||||||
|
*
|
||||||
|
* Note that rcu_read_lock() and the matching rcu_read_unlock() must
|
||||||
|
* occur in the same context, for example, it is illegal to invoke
|
||||||
|
* rcu_read_unlock() in process context if the matching rcu_read_lock()
|
||||||
|
* was invoked from within an irq handler.
|
||||||
|
*
|
||||||
|
* Note that rcu_read_lock() is disallowed if the CPU is either idle or
|
||||||
|
* offline from an RCU perspective, so check for those as well.
|
||||||
|
*/
|
||||||
|
int rcu_read_lock_held(void)
|
||||||
|
{
|
||||||
|
if (!debug_lockdep_rcu_enabled())
|
||||||
|
return 1;
|
||||||
|
if (!rcu_is_watching())
|
||||||
|
return 0;
|
||||||
|
if (!rcu_lockdep_current_cpu_online())
|
||||||
|
return 0;
|
||||||
|
return lock_is_held(&rcu_lock_map);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(rcu_read_lock_held);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section?
|
* rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section?
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue