mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
sched/preempt, locking: Rework local_bh_{dis,en}able()
Currently local_bh_disable() is out-of-line for no apparent reason.
So inline it to save a few cycles on call/return nonsense, the
function body is a single add on x86 (a few loads and store extra on
load/store archs).
Also expose two new local_bh functions:
__local_bh_{dis,en}able_ip(unsigned long ip, unsigned int cnt);
Which implement the actual local_bh_{dis,en}able() behaviour.
The next patch uses the exposed @cnt argument to optimize bh lock
functions.
With build fixes from Jacob Pan.
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: Mike Galbraith <[email protected]>
Cc: [email protected]
Cc: Arjan van de Ven <[email protected]>
Cc: [email protected]
Reviewed-by: Thomas Gleixner <[email protected]>
Signed-off-by: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
parent
10b033d434
commit
0bd3a173d7
4 changed files with 36 additions and 33 deletions
|
|
@ -89,7 +89,7 @@ static void wakeup_softirqd(void)
|
|||
* where hardirqs are disabled legitimately:
|
||||
*/
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
static void __local_bh_disable(unsigned long ip, unsigned int cnt)
|
||||
void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -114,21 +114,9 @@ static void __local_bh_disable(unsigned long ip, unsigned int cnt)
|
|||
if (preempt_count() == cnt)
|
||||
trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1));
|
||||
}
|
||||
#else /* !CONFIG_TRACE_IRQFLAGS */
|
||||
static inline void __local_bh_disable(unsigned long ip, unsigned int cnt)
|
||||
{
|
||||
preempt_count_add(cnt);
|
||||
barrier();
|
||||
}
|
||||
EXPORT_SYMBOL(__local_bh_disable_ip);
|
||||
#endif /* CONFIG_TRACE_IRQFLAGS */
|
||||
|
||||
void local_bh_disable(void)
|
||||
{
|
||||
__local_bh_disable(_RET_IP_, SOFTIRQ_DISABLE_OFFSET);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(local_bh_disable);
|
||||
|
||||
static void __local_bh_enable(unsigned int cnt)
|
||||
{
|
||||
WARN_ON_ONCE(!irqs_disabled());
|
||||
|
|
@ -151,7 +139,7 @@ void _local_bh_enable(void)
|
|||
|
||||
EXPORT_SYMBOL(_local_bh_enable);
|
||||
|
||||
static inline void _local_bh_enable_ip(unsigned long ip)
|
||||
void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
|
||||
{
|
||||
WARN_ON_ONCE(in_irq() || irqs_disabled());
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
|
|
@ -166,7 +154,7 @@ static inline void _local_bh_enable_ip(unsigned long ip)
|
|||
* Keep preemption disabled until we are done with
|
||||
* softirq processing:
|
||||
*/
|
||||
preempt_count_sub(SOFTIRQ_DISABLE_OFFSET - 1);
|
||||
preempt_count_sub(cnt - 1);
|
||||
|
||||
if (unlikely(!in_interrupt() && local_softirq_pending())) {
|
||||
/*
|
||||
|
|
@ -182,18 +170,7 @@ static inline void _local_bh_enable_ip(unsigned long ip)
|
|||
#endif
|
||||
preempt_check_resched();
|
||||
}
|
||||
|
||||
void local_bh_enable(void)
|
||||
{
|
||||
_local_bh_enable_ip(_RET_IP_);
|
||||
}
|
||||
EXPORT_SYMBOL(local_bh_enable);
|
||||
|
||||
void local_bh_enable_ip(unsigned long ip)
|
||||
{
|
||||
_local_bh_enable_ip(ip);
|
||||
}
|
||||
EXPORT_SYMBOL(local_bh_enable_ip);
|
||||
EXPORT_SYMBOL(__local_bh_enable_ip);
|
||||
|
||||
/*
|
||||
* We restart softirq processing for at most MAX_SOFTIRQ_RESTART times,
|
||||
|
|
@ -230,7 +207,7 @@ asmlinkage void __do_softirq(void)
|
|||
pending = local_softirq_pending();
|
||||
account_irq_enter_time(current);
|
||||
|
||||
__local_bh_disable(_RET_IP_, SOFTIRQ_OFFSET);
|
||||
__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
|
||||
lockdep_softirq_enter();
|
||||
|
||||
cpu = smp_processor_id();
|
||||
|
|
|
|||
Loading…
Reference in a new issue