lkml.org 
[lkml]   [2020]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC tip/core/rcu 15/16] rcutorture: Add torture tests for RCU Tasks Trace
    Date
    From: "Paul E. McKenney" <paulmck@kernel.org>

    This commit adds the definitions required to torture the tracing flavor
    of RCU tasks.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    ---
    kernel/rcu/Kconfig.debug | 2 +
    kernel/rcu/rcu.h | 1 +
    kernel/rcu/rcutorture.c | 43 +++++++++++++++++++++-
    .../selftests/rcutorture/configs/rcu/CFLIST | 1 +
    .../selftests/rcutorture/configs/rcu/TRACE01 | 10 +++++
    .../selftests/rcutorture/configs/rcu/TRACE01.boot | 1 +
    6 files changed, 57 insertions(+), 1 deletion(-)
    create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TRACE01
    create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TRACE01.boot

    diff --git a/kernel/rcu/Kconfig.debug b/kernel/rcu/Kconfig.debug
    index b15a3bd..a4db41d 100644
    --- a/kernel/rcu/Kconfig.debug
    +++ b/kernel/rcu/Kconfig.debug
    @@ -25,6 +25,7 @@ config RCU_PERF_TEST
    select SRCU
    select TASKS_RCU
    select TASKS_RUDE_RCU
    + select TASKS_TRACE_RCU
    default n
    help
    This option provides a kernel module that runs performance
    @@ -43,6 +44,7 @@ config RCU_TORTURE_TEST
    select SRCU
    select TASKS_RCU
    select TASKS_RUDE_RCU
    + select TASKS_TRACE_RCU
    default n
    help
    This option provides a kernel module that runs torture tests
    diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h
    index c574620..72903867 100644
    --- a/kernel/rcu/rcu.h
    +++ b/kernel/rcu/rcu.h
    @@ -442,6 +442,7 @@ enum rcutorture_type {
    RCU_FLAVOR,
    RCU_TASKS_FLAVOR,
    RCU_TASKS_RUDE_FLAVOR,
    + RCU_TASKS_TRACING_FLAVOR,
    RCU_TRIVIAL_FLAVOR,
    SRCU_FLAVOR,
    INVALID_RCU_FLAVOR
    diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
    index 1acafc5..ae26ea8 100644
    --- a/kernel/rcu/rcutorture.c
    +++ b/kernel/rcu/rcutorture.c
    @@ -45,6 +45,7 @@
    #include <linux/sched/sysctl.h>
    #include <linux/oom.h>
    #include <linux/tick.h>
    +#include <linux/rcupdate_trace.h>

    #include "rcu.h"

    @@ -758,6 +759,44 @@ static struct rcu_torture_ops tasks_rude_ops = {
    .name = "tasks-rude"
    };

    +/*
    + * Definitions for tracing RCU-tasks torture testing.
    + */
    +
    +static int tasks_tracing_torture_read_lock(void)
    +{
    + rcu_read_lock_trace();
    + return 0;
    +}
    +
    +static void tasks_tracing_torture_read_unlock(int idx)
    +{
    + rcu_read_unlock_trace();
    +}
    +
    +static void rcu_tasks_tracing_torture_deferred_free(struct rcu_torture *p)
    +{
    + call_rcu_tasks_trace(&p->rtort_rcu, rcu_torture_cb);
    +}
    +
    +static struct rcu_torture_ops tasks_tracing_ops = {
    + .ttype = RCU_TASKS_TRACING_FLAVOR,
    + .init = rcu_sync_torture_init,
    + .readlock = tasks_tracing_torture_read_lock,
    + .read_delay = rcu_read_delay, /* just reuse rcu's version. */
    + .readunlock = tasks_tracing_torture_read_unlock,
    + .get_gp_seq = rcu_no_completed,
    + .deferred_free = rcu_tasks_tracing_torture_deferred_free,
    + .sync = synchronize_rcu_tasks_trace,
    + .exp_sync = synchronize_rcu_tasks_trace,
    + .call = call_rcu_tasks_trace,
    + .cb_barrier = rcu_barrier_tasks_trace,
    + .fqs = NULL,
    + .stats = NULL,
    + .irq_capable = 1,
    + .name = "tasks-tracing"
    +};
    +
    static unsigned long rcutorture_seq_diff(unsigned long new, unsigned long old)
    {
    if (!cur_ops->gp_diff)
    @@ -1316,6 +1355,7 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp)
    rcu_read_lock_bh_held() ||
    rcu_read_lock_sched_held() ||
    srcu_read_lock_held(srcu_ctlp) ||
    + rcu_read_lock_trace_held() ||
    torturing_tasks());
    if (p == NULL) {
    /* Wait for rcu_torture_writer to get underway */
    @@ -2435,7 +2475,8 @@ rcu_torture_init(void)
    int firsterr = 0;
    static struct rcu_torture_ops *torture_ops[] = {
    &rcu_ops, &rcu_busted_ops, &srcu_ops, &srcud_ops,
    - &busted_srcud_ops, &tasks_ops, &tasks_rude_ops, &trivial_ops,
    + &busted_srcud_ops, &tasks_ops, &tasks_rude_ops,
    + &tasks_tracing_ops, &trivial_ops,
    };

    if (!torture_init_begin(torture_type, verbose))
    diff --git a/tools/testing/selftests/rcutorture/configs/rcu/CFLIST b/tools/testing/selftests/rcutorture/configs/rcu/CFLIST
    index ec0c72f..dfb1817 100644
    --- a/tools/testing/selftests/rcutorture/configs/rcu/CFLIST
    +++ b/tools/testing/selftests/rcutorture/configs/rcu/CFLIST
    @@ -15,3 +15,4 @@ TASKS01
    TASKS02
    TASKS03
    RUDE01
    +TRACE01
    diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TRACE01 b/tools/testing/selftests/rcutorture/configs/rcu/TRACE01
    new file mode 100644
    index 0000000..078e2c1
    --- /dev/null
    +++ b/tools/testing/selftests/rcutorture/configs/rcu/TRACE01
    @@ -0,0 +1,10 @@
    +CONFIG_SMP=y
    +CONFIG_NR_CPUS=4
    +CONFIG_HOTPLUG_CPU=y
    +CONFIG_PREEMPT_NONE=y
    +CONFIG_PREEMPT_VOLUNTARY=n
    +CONFIG_PREEMPT=n
    +CONFIG_DEBUG_LOCK_ALLOC=y
    +CONFIG_PROVE_LOCKING=y
    +#CHECK#CONFIG_PROVE_RCU=y
    +CONFIG_RCU_EXPERT=y
    diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TRACE01.boot b/tools/testing/selftests/rcutorture/configs/rcu/TRACE01.boot
    new file mode 100644
    index 0000000..9675ad6
    --- /dev/null
    +++ b/tools/testing/selftests/rcutorture/configs/rcu/TRACE01.boot
    @@ -0,0 +1 @@
    +rcutorture.torture_type=tasks-tracing
    --
    2.9.5
    \
     
     \ /
      Last update: 2020-03-12 19:17    [W:4.149 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site