rcu: Unify boost and kthread priorities
authorClark Williams <clark.williams@gmail.com>
Sat, 13 Sep 2014 02:21:09 +0000 (21:21 -0500)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 29 Oct 2014 17:19:41 +0000 (10:19 -0700)
Rename CONFIG_RCU_BOOST_PRIO to CONFIG_RCU_KTHREAD_PRIO and use this
value for both the per-CPU kthreads (rcuc/N) and the rcu boosting
threads (rcub/n).

Also, create the module_parameter rcutree.kthread_prio to be used on
the kernel command line at boot to set a new value (rcutree.kthread_prio=N).

Signed-off-by: Clark Williams <clark.williams@gmail.com>
[ paulmck: Ported to rcu/dev, applied Paul Bolle and Peter Zijlstra feedback. ]
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Documentation/kernel-parameters.txt
init/Kconfig
kernel/rcu/tree_plugin.h
tools/testing/selftests/rcutorture/configs/rcu/TREE03
tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt

index 7dbe5ec9d9cd08afac13797e2adac291fb703eec..6608520e9fa20ac05a917f9fceebdb27ed9877b8 100644 (file)
@@ -2922,6 +2922,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        quiescent states.  Units are jiffies, minimum
                        value is one, and maximum value is HZ.
 
+       rcutree.kthread_prio=    [KNL,BOOT]
+                       Set the SCHED_FIFO priority of the RCU
+                       per-CPU kthreads (rcuc/N). This value is also
+                       used for the priority of the RCU boost threads
+                       (rcub/N). Valid values are 1-99 and the default
+                       is 1 (the least-favored priority).
+
        rcutree.rcu_nocb_leader_stride= [KNL]
                        Set the number of NOCB kthread groups, which
                        defaults to the square root of the number of
index 0c9546ba56e83fa5c691b52fcd4bf0026fcdf1af..15c299cc7c1e6e2af000bd553c6fad9494b0a6b3 100644 (file)
@@ -672,30 +672,31 @@ config RCU_BOOST
          Say Y here if you are working with real-time apps or heavy loads
          Say N here if you are unsure.
 
-config RCU_BOOST_PRIO
-       int "Real-time priority to boost RCU readers to"
+config RCU_KTHREAD_PRIO
+       int "Real-time priority to use for RCU worker threads"
        range 1 99
        depends on RCU_BOOST
        default 1
        help
-         This option specifies the real-time priority to which long-term
-         preempted RCU readers are to be boosted.  If you are working
-         with a real-time application that has one or more CPU-bound
-         threads running at a real-time priority level, you should set
-         RCU_BOOST_PRIO to a priority higher then the highest-priority
-         real-time CPU-bound thread.  The default RCU_BOOST_PRIO value
-         of 1 is appropriate in the common case, which is real-time
+         This option specifies the SCHED_FIFO priority value that will be
+         assigned to the rcuc/n and rcub/n threads and is also the value
+         used for RCU_BOOST (if enabled). If you are working with a
+         real-time application that has one or more CPU-bound threads
+         running at a real-time priority level, you should set
+         RCU_KTHREAD_PRIO to a priority higher than the highest-priority
+         real-time CPU-bound application thread.  The default RCU_KTHREAD_PRIO
+         value of 1 is appropriate in the common case, which is real-time
          applications that do not have any CPU-bound threads.
 
          Some real-time applications might not have a single real-time
          thread that saturates a given CPU, but instead might have
          multiple real-time threads that, taken together, fully utilize
-         that CPU.  In this case, you should set RCU_BOOST_PRIO to
+         that CPU.  In this case, you should set RCU_KTHREAD_PRIO to
          a priority higher than the lowest-priority thread that is
          conspiring to prevent the CPU from running any non-real-time
          tasks.  For example, if one thread at priority 10 and another
          thread at priority 5 are between themselves fully consuming
-         the CPU time on a given CPU, then RCU_BOOST_PRIO should be
+         the CPU time on a given CPU, then RCU_KTHREAD_PRIO should be
          set to priority 6 or higher.
 
          Specify the real-time priority, or take the default if unsure.
index 357891104ea0797df85b8844a4a8b4cb79a1acab..344f0e6615152e20a14dc437f224ef0736e07e51 100644 (file)
 #include <linux/smpboot.h>
 #include "../time/tick-internal.h"
 
-#define RCU_KTHREAD_PRIO 1
-
 #ifdef CONFIG_RCU_BOOST
 
 #include "../locking/rtmutex_common.h"
-#define RCU_BOOST_PRIO CONFIG_RCU_BOOST_PRIO
+
+/* rcuc/rcub kthread realtime priority */
+static int kthread_prio = CONFIG_RCU_KTHREAD_PRIO;
+module_param(kthread_prio, int, 0644);
 
 /*
  * Control variables for per-CPU and per-rcu_node kthreads.  These
@@ -46,11 +47,7 @@ DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status);
 DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);
 DEFINE_PER_CPU(char, rcu_cpu_has_work);
 
-#else /* #ifdef CONFIG_RCU_BOOST */
-
-#define RCU_BOOST_PRIO RCU_KTHREAD_PRIO
-
-#endif /* #else #ifdef CONFIG_RCU_BOOST */
+#endif /* #ifdef CONFIG_RCU_BOOST */
 
 #ifdef CONFIG_RCU_NOCB_CPU
 static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */
@@ -98,6 +95,9 @@ static void __init rcu_bootup_announce_oddness(void)
                pr_info("\tBoot-time adjustment of leaf fanout to %d.\n", rcu_fanout_leaf);
        if (nr_cpu_ids != NR_CPUS)
                pr_info("\tRCU restricting CPUs from NR_CPUS=%d to nr_cpu_ids=%d.\n", NR_CPUS, nr_cpu_ids);
+#ifdef CONFIG_RCU_BOOST
+       pr_info("\tRCU kthread priority: %d.\n", kthread_prio);
+#endif
 }
 
 #ifdef CONFIG_TREE_PREEMPT_RCU
@@ -1339,7 +1339,7 @@ static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp,
        smp_mb__after_unlock_lock();
        rnp->boost_kthread_task = t;
        raw_spin_unlock_irqrestore(&rnp->lock, flags);
-       sp.sched_priority = RCU_BOOST_PRIO;
+       sp.sched_priority = kthread_prio;
        sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
        wake_up_process(t); /* get to TASK_INTERRUPTIBLE quickly. */
        return 0;
@@ -1356,7 +1356,7 @@ static void rcu_cpu_kthread_setup(unsigned int cpu)
 {
        struct sched_param sp;
 
-       sp.sched_priority = RCU_KTHREAD_PRIO;
+       sp.sched_priority = kthread_prio;
        sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
 }
 
index f4567fb3e3325ce967f5731cfbde164151f3d368..b95f62efd6f25f24908a7f6684561b5b35b663d9 100644 (file)
@@ -17,5 +17,5 @@ CONFIG_DEBUG_LOCK_ALLOC=n
 CONFIG_RCU_CPU_STALL_INFO=n
 CONFIG_RCU_CPU_STALL_VERBOSE=n
 CONFIG_RCU_BOOST=y
-CONFIG_RCU_BOOST_PRIO=2
+CONFIG_RCU_KTHREAD_PRIO=2
 CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
index 3e588db86a17c23cb952419753ed0cde5daa6d04..ab6e7b4103ac3c86ce2c152d36ea765412b62f80 100644 (file)
@@ -15,8 +15,8 @@ CONFIG_PREEMPT -- Do half.  (First three and #8.)
 CONFIG_PROVE_LOCKING -- Do all but two, covering CONFIG_PROVE_RCU and not.
 CONFIG_PROVE_RCU -- Do all but one under CONFIG_PROVE_LOCKING.
 CONFIG_RCU_BOOST -- one of TREE_PREEMPT_RCU.
-CONFIG_RCU_BOOST_PRIO -- set to 2 for _BOOST testing.
-CONFIG_RCU_CPU_STALL_INFO -- do one with and without _VERBOSE.
+CONFIG_RCU_KTHREAD_PRIO -- set to 2 for _BOOST testing.
+CONFIG_RCU_CPU_STALL_INFO -- Do one.
 CONFIG_RCU_CPU_STALL_VERBOSE -- do one with and without _INFO.
 CONFIG_RCU_FANOUT -- Cover hierarchy as currently, but overlap with others.
 CONFIG_RCU_FANOUT_EXACT -- Do one.