Commit 21871d7e authored by Clark Williams's avatar Clark Williams Committed by Paul E. McKenney

rcu: Unify boost and kthread priorities

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: default avatarClark Williams <clark.williams@gmail.com>
[ paulmck: Ported to rcu/dev, applied Paul Bolle and Peter Zijlstra feedback. ]
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent e0775cef
...@@ -2922,6 +2922,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -2922,6 +2922,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
quiescent states. Units are jiffies, minimum quiescent states. Units are jiffies, minimum
value is one, and maximum value is HZ. 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] rcutree.rcu_nocb_leader_stride= [KNL]
Set the number of NOCB kthread groups, which Set the number of NOCB kthread groups, which
defaults to the square root of the number of defaults to the square root of the number of
......
...@@ -672,30 +672,31 @@ config RCU_BOOST ...@@ -672,30 +672,31 @@ config RCU_BOOST
Say Y here if you are working with real-time apps or heavy loads Say Y here if you are working with real-time apps or heavy loads
Say N here if you are unsure. Say N here if you are unsure.
config RCU_BOOST_PRIO config RCU_KTHREAD_PRIO
int "Real-time priority to boost RCU readers to" int "Real-time priority to use for RCU worker threads"
range 1 99 range 1 99
depends on RCU_BOOST depends on RCU_BOOST
default 1 default 1
help help
This option specifies the real-time priority to which long-term This option specifies the SCHED_FIFO priority value that will be
preempted RCU readers are to be boosted. If you are working assigned to the rcuc/n and rcub/n threads and is also the value
with a real-time application that has one or more CPU-bound used for RCU_BOOST (if enabled). If you are working with a
threads running at a real-time priority level, you should set real-time application that has one or more CPU-bound threads
RCU_BOOST_PRIO to a priority higher then the highest-priority running at a real-time priority level, you should set
real-time CPU-bound thread. The default RCU_BOOST_PRIO value RCU_KTHREAD_PRIO to a priority higher than the highest-priority
of 1 is appropriate in the common case, which is real-time 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. applications that do not have any CPU-bound threads.
Some real-time applications might not have a single real-time Some real-time applications might not have a single real-time
thread that saturates a given CPU, but instead might have thread that saturates a given CPU, but instead might have
multiple real-time threads that, taken together, fully utilize 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 a priority higher than the lowest-priority thread that is
conspiring to prevent the CPU from running any non-real-time conspiring to prevent the CPU from running any non-real-time
tasks. For example, if one thread at priority 10 and another tasks. For example, if one thread at priority 10 and another
thread at priority 5 are between themselves fully consuming 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. set to priority 6 or higher.
Specify the real-time priority, or take the default if unsure. Specify the real-time priority, or take the default if unsure.
......
...@@ -30,12 +30,13 @@ ...@@ -30,12 +30,13 @@
#include <linux/smpboot.h> #include <linux/smpboot.h>
#include "../time/tick-internal.h" #include "../time/tick-internal.h"
#define RCU_KTHREAD_PRIO 1
#ifdef CONFIG_RCU_BOOST #ifdef CONFIG_RCU_BOOST
#include "../locking/rtmutex_common.h" #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 * Control variables for per-CPU and per-rcu_node kthreads. These
...@@ -46,11 +47,7 @@ DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status); ...@@ -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(unsigned int, rcu_cpu_kthread_loops);
DEFINE_PER_CPU(char, rcu_cpu_has_work); DEFINE_PER_CPU(char, rcu_cpu_has_work);
#else /* #ifdef CONFIG_RCU_BOOST */ #endif /* #ifdef CONFIG_RCU_BOOST */
#define RCU_BOOST_PRIO RCU_KTHREAD_PRIO
#endif /* #else #ifdef CONFIG_RCU_BOOST */
#ifdef CONFIG_RCU_NOCB_CPU #ifdef CONFIG_RCU_NOCB_CPU
static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */ static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */
...@@ -98,6 +95,9 @@ static void __init rcu_bootup_announce_oddness(void) ...@@ -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); pr_info("\tBoot-time adjustment of leaf fanout to %d.\n", rcu_fanout_leaf);
if (nr_cpu_ids != NR_CPUS) 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); 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 #ifdef CONFIG_TREE_PREEMPT_RCU
...@@ -1339,7 +1339,7 @@ static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp, ...@@ -1339,7 +1339,7 @@ static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp,
smp_mb__after_unlock_lock(); smp_mb__after_unlock_lock();
rnp->boost_kthread_task = t; rnp->boost_kthread_task = t;
raw_spin_unlock_irqrestore(&rnp->lock, flags); 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); sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
wake_up_process(t); /* get to TASK_INTERRUPTIBLE quickly. */ wake_up_process(t); /* get to TASK_INTERRUPTIBLE quickly. */
return 0; return 0;
...@@ -1356,7 +1356,7 @@ static void rcu_cpu_kthread_setup(unsigned int cpu) ...@@ -1356,7 +1356,7 @@ static void rcu_cpu_kthread_setup(unsigned int cpu)
{ {
struct sched_param sp; struct sched_param sp;
sp.sched_priority = RCU_KTHREAD_PRIO; sp.sched_priority = kthread_prio;
sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
} }
......
...@@ -17,5 +17,5 @@ CONFIG_DEBUG_LOCK_ALLOC=n ...@@ -17,5 +17,5 @@ CONFIG_DEBUG_LOCK_ALLOC=n
CONFIG_RCU_CPU_STALL_INFO=n CONFIG_RCU_CPU_STALL_INFO=n
CONFIG_RCU_CPU_STALL_VERBOSE=n CONFIG_RCU_CPU_STALL_VERBOSE=n
CONFIG_RCU_BOOST=y CONFIG_RCU_BOOST=y
CONFIG_RCU_BOOST_PRIO=2 CONFIG_RCU_KTHREAD_PRIO=2
CONFIG_DEBUG_OBJECTS_RCU_HEAD=n CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
...@@ -15,8 +15,8 @@ CONFIG_PREEMPT -- Do half. (First three and #8.) ...@@ -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_LOCKING -- Do all but two, covering CONFIG_PROVE_RCU and not.
CONFIG_PROVE_RCU -- Do all but one under CONFIG_PROVE_LOCKING. CONFIG_PROVE_RCU -- Do all but one under CONFIG_PROVE_LOCKING.
CONFIG_RCU_BOOST -- one of TREE_PREEMPT_RCU. CONFIG_RCU_BOOST -- one of TREE_PREEMPT_RCU.
CONFIG_RCU_BOOST_PRIO -- set to 2 for _BOOST testing. CONFIG_RCU_KTHREAD_PRIO -- set to 2 for _BOOST testing.
CONFIG_RCU_CPU_STALL_INFO -- do one with and without _VERBOSE. CONFIG_RCU_CPU_STALL_INFO -- Do one.
CONFIG_RCU_CPU_STALL_VERBOSE -- do one with and without _INFO. 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 -- Cover hierarchy as currently, but overlap with others.
CONFIG_RCU_FANOUT_EXACT -- Do one. CONFIG_RCU_FANOUT_EXACT -- Do one.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment