mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
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: 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>
This commit is contained in:
parent
e0775cefb5
commit
21871d7eff
@ -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
|
||||
|
23
init/Kconfig
23
init/Kconfig
@ -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.
|
||||
|
@ -30,12 +30,13 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user