Commit c1a76c0b authored by Paul E. McKenney's avatar Paul E. McKenney

rcutorture: Add torture tests for RCU Tasks Trace

This commit adds the definitions required to torture the tracing flavor
of RCU tasks.
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent d5f177d3
...@@ -30,6 +30,7 @@ config RCU_PERF_TEST ...@@ -30,6 +30,7 @@ config RCU_PERF_TEST
select SRCU select SRCU
select TASKS_RCU select TASKS_RCU
select TASKS_RUDE_RCU select TASKS_RUDE_RCU
select TASKS_TRACE_RCU
default n default n
help help
This option provides a kernel module that runs performance This option provides a kernel module that runs performance
...@@ -48,6 +49,7 @@ config RCU_TORTURE_TEST ...@@ -48,6 +49,7 @@ config RCU_TORTURE_TEST
select SRCU select SRCU
select TASKS_RCU select TASKS_RCU
select TASKS_RUDE_RCU select TASKS_RUDE_RCU
select TASKS_TRACE_RCU
default n default n
help help
This option provides a kernel module that runs torture tests This option provides a kernel module that runs torture tests
......
...@@ -442,6 +442,7 @@ enum rcutorture_type { ...@@ -442,6 +442,7 @@ enum rcutorture_type {
RCU_FLAVOR, RCU_FLAVOR,
RCU_TASKS_FLAVOR, RCU_TASKS_FLAVOR,
RCU_TASKS_RUDE_FLAVOR, RCU_TASKS_RUDE_FLAVOR,
RCU_TASKS_TRACING_FLAVOR,
RCU_TRIVIAL_FLAVOR, RCU_TRIVIAL_FLAVOR,
SRCU_FLAVOR, SRCU_FLAVOR,
INVALID_RCU_FLAVOR INVALID_RCU_FLAVOR
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <linux/sched/sysctl.h> #include <linux/sched/sysctl.h>
#include <linux/oom.h> #include <linux/oom.h>
#include <linux/tick.h> #include <linux/tick.h>
#include <linux/rcupdate_trace.h>
#include "rcu.h" #include "rcu.h"
...@@ -757,6 +758,45 @@ static struct rcu_torture_ops tasks_rude_ops = { ...@@ -757,6 +758,45 @@ static struct rcu_torture_ops tasks_rude_ops = {
.name = "tasks-rude" .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 = srcu_read_delay, /* just reuse srcu'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,
.slow_gps = 1,
.name = "tasks-tracing"
};
static unsigned long rcutorture_seq_diff(unsigned long new, unsigned long old) static unsigned long rcutorture_seq_diff(unsigned long new, unsigned long old)
{ {
if (!cur_ops->gp_diff) if (!cur_ops->gp_diff)
...@@ -1323,6 +1363,7 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp) ...@@ -1323,6 +1363,7 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp)
rcu_read_lock_bh_held() || rcu_read_lock_bh_held() ||
rcu_read_lock_sched_held() || rcu_read_lock_sched_held() ||
srcu_read_lock_held(srcu_ctlp) || srcu_read_lock_held(srcu_ctlp) ||
rcu_read_lock_trace_held() ||
torturing_tasks()); torturing_tasks());
if (p == NULL) { if (p == NULL) {
/* Wait for rcu_torture_writer to get underway */ /* Wait for rcu_torture_writer to get underway */
...@@ -2440,7 +2481,8 @@ rcu_torture_init(void) ...@@ -2440,7 +2481,8 @@ rcu_torture_init(void)
int firsterr = 0; int firsterr = 0;
static struct rcu_torture_ops *torture_ops[] = { static struct rcu_torture_ops *torture_ops[] = {
&rcu_ops, &rcu_busted_ops, &srcu_ops, &srcud_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)) if (!torture_init_begin(torture_type, verbose))
......
...@@ -15,3 +15,4 @@ TASKS01 ...@@ -15,3 +15,4 @@ TASKS01
TASKS02 TASKS02
TASKS03 TASKS03
RUDE01 RUDE01
TRACE01
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
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