diff options
author | Nicholas Mc Guire <der.herr@hofr.at> | 2013-12-06 00:42:22 +0100 |
---|---|---|
committer | Anders Roxell <anders.roxell@linaro.org> | 2015-05-20 00:23:57 +0200 |
commit | 7aa2c415d216b1d2150afb9b8441a2d20fc346e0 (patch) | |
tree | fcf59de5dff9c3dd2ec2833914e2aca43ea593bf /kernel | |
parent | 6d613c0649393c5472daff9328fd350683f7f1ed (diff) |
softirq: make migrate disable/enable conditioned on softirq_nestcnt transition
This patch removes the recursive calls to migrate_disable/enable in
local_bh_disable/enable
the softirq-local-lock.patch introduces local_bh_disable/enable wich
decrements/increments the current->softirq_nestcnt and disable/enables
migration as well. as softirq_nestcnt (include/linux/sched.h conditioned
on CONFIG_PREEMPT_RT_BASE) already is tracking the nesting level of the
recursive calls to local_bh_disable/enable (all in kernel/softirq.c) - no
need to do it twice.
migrate_disable/enable thus can be conditionsed on softirq_nestcnt making
a transition from 0-1 to disable migration and 1-0 to re-enable it.
No change of functional behavior, this does noticably reduce the observed
nesting level of migrate_disable/enable
Signed-off-by: Nicholas Mc Guire <der.herr@hofr.at>
Reviewed-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/softirq.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 2a47ad9c26f5..2ae52d6b5a07 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -554,8 +554,8 @@ static void do_current_softirqs(int need_rcu_bh_qs) static void __local_bh_disable(void) { - migrate_disable(); - current->softirq_nestcnt++; + if (++current->softirq_nestcnt == 1) + migrate_disable(); } void local_bh_disable(void) @@ -581,8 +581,8 @@ static void __local_bh_enable(void) do_current_softirqs(1); local_irq_enable(); - current->softirq_nestcnt--; - migrate_enable(); + if (--current->softirq_nestcnt == 0) + migrate_enable(); } void local_bh_enable(void) @@ -606,8 +606,10 @@ EXPORT_SYMBOL(local_bh_enable_ip); void _local_bh_enable(void) { - current->softirq_nestcnt--; - migrate_enable(); + if (WARN_ON(current->softirq_nestcnt == 0)) + return; + if (--current->softirq_nestcnt == 0) + migrate_enable(); } EXPORT_SYMBOL(_local_bh_enable); |