rcu-tasks: Add Kconfig option to mediate smp_mb() vs. IPI
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 19 Mar 2020 00:16:37 +0000 (17:16 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 27 Apr 2020 18:03:52 +0000 (11:03 -0700)
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>
include/linux/rcupdate_trace.h
kernel/rcu/Kconfig
kernel/rcu/tasks.h

index c42b365..4c25a41 100644 (file)
@@ -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);
 }
index cb1d18e..0ebe15a 100644 (file)
@@ -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"
index 4857450..4147857 100644 (file)
@@ -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)