softirq: A single rcu_bh_qs() call per softirq set is enough
Calling rcu_bh_qs() after every softirq action is not really needed. What RCU needs is at least one rcu_bh_qs() per softirq round to note a quiescent state was passed for rcu_bh. Note for Paul and myself : this could be inlined as a single instruction and avoid smp_processor_id() (sone this_cpu_write(rcu_bh_data.passed_quiesce, 1)) Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
Родитель
fa07a58f71
Коммит
a5d6d3a1b0
|
@ -232,7 +232,6 @@ asmlinkage void __do_softirq(void)
|
||||||
bool in_hardirq;
|
bool in_hardirq;
|
||||||
__u32 pending;
|
__u32 pending;
|
||||||
int softirq_bit;
|
int softirq_bit;
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mask out PF_MEMALLOC s current task context is borrowed for the
|
* Mask out PF_MEMALLOC s current task context is borrowed for the
|
||||||
|
@ -247,7 +246,6 @@ asmlinkage void __do_softirq(void)
|
||||||
__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
|
__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
|
||||||
in_hardirq = lockdep_softirq_start();
|
in_hardirq = lockdep_softirq_start();
|
||||||
|
|
||||||
cpu = smp_processor_id();
|
|
||||||
restart:
|
restart:
|
||||||
/* Reset the pending bitmask before enabling irqs */
|
/* Reset the pending bitmask before enabling irqs */
|
||||||
set_softirq_pending(0);
|
set_softirq_pending(0);
|
||||||
|
@ -276,11 +274,11 @@ restart:
|
||||||
prev_count, preempt_count());
|
prev_count, preempt_count());
|
||||||
preempt_count_set(prev_count);
|
preempt_count_set(prev_count);
|
||||||
}
|
}
|
||||||
rcu_bh_qs(cpu);
|
|
||||||
h++;
|
h++;
|
||||||
pending >>= softirq_bit;
|
pending >>= softirq_bit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rcu_bh_qs(smp_processor_id());
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
pending = local_softirq_pending();
|
pending = local_softirq_pending();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче