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;
|
||||
__u32 pending;
|
||||
int softirq_bit;
|
||||
int cpu;
|
||||
|
||||
/*
|
||||
* 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);
|
||||
in_hardirq = lockdep_softirq_start();
|
||||
|
||||
cpu = smp_processor_id();
|
||||
restart:
|
||||
/* Reset the pending bitmask before enabling irqs */
|
||||
set_softirq_pending(0);
|
||||
|
@ -276,11 +274,11 @@ restart:
|
|||
prev_count, preempt_count());
|
||||
preempt_count_set(prev_count);
|
||||
}
|
||||
rcu_bh_qs(cpu);
|
||||
h++;
|
||||
pending >>= softirq_bit;
|
||||
}
|
||||
|
||||
rcu_bh_qs(smp_processor_id());
|
||||
local_irq_disable();
|
||||
|
||||
pending = local_softirq_pending();
|
||||
|
|
Загрузка…
Ссылка в новой задаче