rcu-tasks: Provide boot parameter to delay IPIs until late in grace period
This commit provides a rcupdate.rcu_task_ipi_delay kernel boot parameter that specifies how old the RCU tasks trace grace period must be before the grace-period kthread starts sending IPIs. This delay allows more tasks to pass through rcu_tasks_qs() quiescent states, thus reducing (or even eliminating) the number of IPIs that must be sent. On a short rcutorture test setting this kernel boot parameter to HZ/2 resulted in zero IPIs for all 877 RCU-tasks trace grace periods that elapsed during that test. Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
88092d0c99
commit
b0afa0f056
|
@ -4286,6 +4286,13 @@
|
||||||
only normal grace-period primitives. No effect
|
only normal grace-period primitives. No effect
|
||||||
on CONFIG_TINY_RCU kernels.
|
on CONFIG_TINY_RCU kernels.
|
||||||
|
|
||||||
|
rcupdate.rcu_task_ipi_delay= [KNL]
|
||||||
|
Set time in jiffies during which RCU tasks will
|
||||||
|
avoid sending IPIs, starting with the beginning
|
||||||
|
of a given grace period. Setting a large
|
||||||
|
number avoids disturbing real-time workloads,
|
||||||
|
but lengthens grace periods.
|
||||||
|
|
||||||
rcupdate.rcu_task_stall_timeout= [KNL]
|
rcupdate.rcu_task_stall_timeout= [KNL]
|
||||||
Set timeout in jiffies for RCU task stall warning
|
Set timeout in jiffies for RCU task stall warning
|
||||||
messages. Disable with a value less than or equal
|
messages. Disable with a value less than or equal
|
||||||
|
|
|
@ -74,6 +74,11 @@ static struct rcu_tasks rt_name = \
|
||||||
/* Track exiting tasks in order to allow them to be waited for. */
|
/* Track exiting tasks in order to allow them to be waited for. */
|
||||||
DEFINE_STATIC_SRCU(tasks_rcu_exit_srcu);
|
DEFINE_STATIC_SRCU(tasks_rcu_exit_srcu);
|
||||||
|
|
||||||
|
/* Avoid IPIing CPUs early in the grace period. */
|
||||||
|
#define RCU_TASK_IPI_DELAY (HZ / 2)
|
||||||
|
static int rcu_task_ipi_delay __read_mostly = RCU_TASK_IPI_DELAY;
|
||||||
|
module_param(rcu_task_ipi_delay, int, 0644);
|
||||||
|
|
||||||
/* Control stall timeouts. Disable with <= 0, otherwise jiffies till stall. */
|
/* Control stall timeouts. Disable with <= 0, otherwise jiffies till stall. */
|
||||||
#define RCU_TASK_STALL_TIMEOUT (HZ * 60 * 10)
|
#define RCU_TASK_STALL_TIMEOUT (HZ * 60 * 10)
|
||||||
static int rcu_task_stall_timeout __read_mostly = RCU_TASK_STALL_TIMEOUT;
|
static int rcu_task_stall_timeout __read_mostly = RCU_TASK_STALL_TIMEOUT;
|
||||||
|
@ -713,6 +718,10 @@ DECLARE_WAIT_QUEUE_HEAD(trc_wait); // List of holdout tasks.
|
||||||
// Record outstanding IPIs to each CPU. No point in sending two...
|
// Record outstanding IPIs to each CPU. No point in sending two...
|
||||||
static DEFINE_PER_CPU(bool, trc_ipi_to_cpu);
|
static DEFINE_PER_CPU(bool, trc_ipi_to_cpu);
|
||||||
|
|
||||||
|
void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func);
|
||||||
|
DEFINE_RCU_TASKS(rcu_tasks_trace, rcu_tasks_wait_gp, call_rcu_tasks_trace,
|
||||||
|
"RCU Tasks Trace");
|
||||||
|
|
||||||
/* If we are the last reader, wake up the grace-period kthread. */
|
/* If we are the last reader, wake up the grace-period kthread. */
|
||||||
void rcu_read_unlock_trace_special(struct task_struct *t)
|
void rcu_read_unlock_trace_special(struct task_struct *t)
|
||||||
{
|
{
|
||||||
|
@ -998,10 +1007,6 @@ void exit_tasks_rcu_finish_trace(struct task_struct *t)
|
||||||
rcu_read_unlock_trace_special(t);
|
rcu_read_unlock_trace_special(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func);
|
|
||||||
DEFINE_RCU_TASKS(rcu_tasks_trace, rcu_tasks_wait_gp, call_rcu_tasks_trace,
|
|
||||||
"RCU Tasks Trace");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* call_rcu_tasks_trace() - Queue a callback trace task-based grace period
|
* call_rcu_tasks_trace() - Queue a callback trace task-based grace period
|
||||||
* @rhp: structure to be used for queueing the RCU updates.
|
* @rhp: structure to be used for queueing the RCU updates.
|
||||||
|
|
Loading…
Reference in a new issue