lkml.org 
[lkml]   [2020]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 tip/core/rcu 22/34] rcu-tasks: Provide boot parameter to delay IPIs until late in grace period
    Date
    From: "Paul E. McKenney" <paulmck@kernel.org>

    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>
    ---
    Documentation/admin-guide/kernel-parameters.txt | 7 +++++++
    kernel/rcu/tasks.h | 15 ++++++++++-----
    2 files changed, 17 insertions(+), 5 deletions(-)

    diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
    index df2baf9..6f3b3be 100644
    --- a/Documentation/admin-guide/kernel-parameters.txt
    +++ b/Documentation/admin-guide/kernel-parameters.txt
    @@ -4246,6 +4246,13 @@
    only normal grace-period primitives. No effect
    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]
    Set timeout in jiffies for RCU task stall warning
    messages. Disable with a value less than or equal
    diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
    index fa9c069..a034f48 100644
    --- a/kernel/rcu/tasks.h
    +++ b/kernel/rcu/tasks.h
    @@ -74,6 +74,11 @@ static struct rcu_tasks rt_name = \
    /* Track exiting tasks in order to allow them to be waited for. */
    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. */
    #define RCU_TASK_STALL_TIMEOUT (HZ * 60 * 10)
    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...
    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. */
    void rcu_read_unlock_trace_special(struct task_struct *t)
    {
    @@ -825,7 +834,7 @@ static void trc_wait_for_one_reader(struct task_struct *t,

    // If currently running, send an IPI, either way, add to list.
    trc_add_holdout(t, bhp);
    - if (task_curr(t)) {
    + if (task_curr(t) && time_after(jiffies, rcu_tasks_trace.gp_start + rcu_task_ipi_delay)) {
    // The task is currently running, so try IPIing it.
    cpu = task_cpu(t);

    @@ -994,10 +1003,6 @@ void exit_tasks_rcu_finish_trace(struct task_struct *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
    * @rhp: structure to be used for queueing the RCU updates.
    --
    2.9.5
    \
     
     \ /
      Last update: 2020-03-27 23:28    [W:7.157 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site