Commit 9ae58d7b authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

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: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 238dbce3
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ static inline void rcu_read_lock_trace(void)
	struct task_struct *t = current;

	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
	rcu_lock_acquire(&rcu_trace_lock_map);
}
+18 −0
Original line number Diff line number Diff line
@@ -234,4 +234,22 @@ config RCU_NOCB_CPU
	  Say Y here if you want to help to debug reduced OS jitter.
	  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"
+2 −1
Original line number Diff line number Diff line
@@ -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;

	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.
	// Update .need_qs before ->trc_reader_nesting for irq/NMI handlers.
	if (nq)