rcu-tasks: Add Kconfig option to mediate smp_mb() vs. IPI
This commit provides a new TASKS_TRACE_RCU_READ_MB Kconfig option that enables use of read-side memory barriers by both rcu_read_lock_trace() and rcu_read_unlock_trace() when the are executed with the current->trc_reader_special.b.need_mb flag set. This flag is currently never set. Doing that is the subject of a later commit. Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
@@ -50,7 +50,8 @@ static inline void rcu_read_lock_trace(void)
|
|||||||
struct task_struct *t = current;
|
struct task_struct *t = current;
|
||||||
|
|
||||||
WRITE_ONCE(t->trc_reader_nesting, READ_ONCE(t->trc_reader_nesting) + 1);
|
WRITE_ONCE(t->trc_reader_nesting, READ_ONCE(t->trc_reader_nesting) + 1);
|
||||||
if (t->trc_reader_special.b.need_mb)
|
if (IS_ENABLED(CONFIG_TASKS_TRACE_RCU_READ_MB) &&
|
||||||
|
t->trc_reader_special.b.need_mb)
|
||||||
smp_mb(); // Pairs with update-side barriers
|
smp_mb(); // Pairs with update-side barriers
|
||||||
rcu_lock_acquire(&rcu_trace_lock_map);
|
rcu_lock_acquire(&rcu_trace_lock_map);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -234,4 +234,22 @@ config RCU_NOCB_CPU
|
|||||||
Say Y here if you want to help to debug reduced OS jitter.
|
Say Y here if you want to help to debug reduced OS jitter.
|
||||||
Say N here if you are unsure.
|
Say N here if you are unsure.
|
||||||
|
|
||||||
|
config TASKS_TRACE_RCU_READ_MB
|
||||||
|
bool "Tasks Trace RCU readers use memory barriers in user and idle"
|
||||||
|
depends on RCU_EXPERT
|
||||||
|
default PREEMPT_RT || NR_CPUS < 8
|
||||||
|
help
|
||||||
|
Use this option to further reduce the number of IPIs sent
|
||||||
|
to CPUs executing in userspace or idle during tasks trace
|
||||||
|
RCU grace periods. Given that a reasonable setting of
|
||||||
|
the rcupdate.rcu_task_ipi_delay kernel boot parameter
|
||||||
|
eliminates such IPIs for many workloads, proper setting
|
||||||
|
of this Kconfig option is important mostly for aggressive
|
||||||
|
real-time installations and for battery-powered devices,
|
||||||
|
hence the default chosen above.
|
||||||
|
|
||||||
|
Say Y here if you hate IPIs.
|
||||||
|
Say N here if you hate read-side memory barriers.
|
||||||
|
Take the default if you are unsure.
|
||||||
|
|
||||||
endmenu # "RCU Subsystem"
|
endmenu # "RCU Subsystem"
|
||||||
|
|||||||
@@ -734,7 +734,8 @@ void rcu_read_unlock_trace_special(struct task_struct *t, int nesting)
|
|||||||
{
|
{
|
||||||
int nq = t->trc_reader_special.b.need_qs;
|
int nq = t->trc_reader_special.b.need_qs;
|
||||||
|
|
||||||
if (t->trc_reader_special.b.need_mb)
|
if (IS_ENABLED(CONFIG_TASKS_TRACE_RCU_READ_MB) &&
|
||||||
|
t->trc_reader_special.b.need_mb)
|
||||||
smp_mb(); // Pairs with update-side barriers.
|
smp_mb(); // Pairs with update-side barriers.
|
||||||
// Update .need_qs before ->trc_reader_nesting for irq/NMI handlers.
|
// Update .need_qs before ->trc_reader_nesting for irq/NMI handlers.
|
||||||
if (nq)
|
if (nq)
|
||||||
|
|||||||
Reference in New Issue
Block a user