All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@kernel.org>
To: Uladzislau Rezki <urezki@gmail.com>
Cc: LKML <linux-kernel@vger.kernel.org>, RCU <rcu@vger.kernel.org>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Andrew Morton <akpm@linux-foundation.org>,
	Daniel Axtens <dja@axtens.net>,
	Frederic Weisbecker <frederic@kernel.org>,
	Neeraj Upadhyay <neeraju@codeaurora.org>,
	Joel Fernandes <joel@joelfernandes.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Michal Hocko <mhocko@suse.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Theodore Y . Ts'o" <tytso@mit.edu>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Oleksiy Avramchenko <oleksiy.avramchenko@sonymobile.com>
Subject: Re: [PATCH 2/2] rcu-tasks: add RCU-tasks self tests
Date: Mon, 21 Dec 2020 11:29:06 -0800	[thread overview]
Message-ID: <20201221192906.GX2657@paulmck-ThinkPad-P72> (raw)
In-Reply-To: <20201221184539.GA24895@pc638.lan>

On Mon, Dec 21, 2020 at 07:45:39PM +0100, Uladzislau Rezki wrote:
> On Mon, Dec 21, 2020 at 09:18:05AM -0800, Paul E. McKenney wrote:
> > On Mon, Dec 21, 2020 at 04:38:09PM +0100, Uladzislau Rezki wrote:
> > > On Wed, Dec 16, 2020 at 03:29:55PM -0800, Paul E. McKenney wrote:
> > > > On Wed, Dec 16, 2020 at 04:49:59PM +0100, Uladzislau Rezki wrote:
> > 
> > [ . . . ]
> > 
> > > > > 2.20.1
> > > > 
> > > > Again, much improved!
> > > > 
> > > See below the v3 version. I hope i fixed all comments :)
> > > 
> > > >From 06f7adfd84cbb1994d0e2693ee9dcdfd272a9bd0 Mon Sep 17 00:00:00 2001
> > > From: "Uladzislau Rezki (Sony)" <urezki@gmail.com>
> > > Date: Wed, 9 Dec 2020 21:27:32 +0100
> > > Subject: [PATCH v3 1/1] rcu-tasks: Add RCU-tasks self tests
> > > 
> > > This commit adds self tests for early-boot use of RCU-tasks grace periods.
> > > It tests all three variants (Rude, Tasks, and Tasks Trace) and covers
> > > both synchronous (e.g., synchronize_rcu_tasks()) and asynchronous (e.g.,
> > > call_rcu_tasks()) grace-period APIs.
> > > 
> > > Self-tests are run only in kernels built with CONFIG_PROVE_RCU=y.
> > > 
> > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
> > 
> > Much better!
> > 
> > I pulled this in, but made one small additional change.  Please let me
> > know if this is problematic.
> > 
> > 							Thanx, Paul
> > 
> > ------------------------------------------------------------------------
> > 
> > commit 93372198b5c9efdfd288aa3b3ee41c1f90866886
> > Author: Uladzislau Rezki (Sony) <urezki@gmail.com>
> > Date:   Wed Dec 9 21:27:32 2020 +0100
> > 
> >     rcu-tasks: Add RCU-tasks self tests
> >     
> >     This commit adds self tests for early-boot use of RCU-tasks grace periods.
> >     It tests all three variants (Rude, Tasks, and Tasks Trace) and covers
> >     both synchronous (e.g., synchronize_rcu_tasks()) and asynchronous (e.g.,
> >     call_rcu_tasks()) grace-period APIs.
> >     
> >     Self-tests are run only in kernels built with CONFIG_PROVE_RCU=y.
> >     
> >     Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
> >     Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> > 
> > diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
> > index 3660755..35a2cd5 100644
> > --- a/kernel/rcu/tasks.h
> > +++ b/kernel/rcu/tasks.h
> > @@ -1224,6 +1224,40 @@ void show_rcu_tasks_gp_kthreads(void)
> >  }
> >  #endif /* #ifndef CONFIG_TINY_RCU */
> >  
> > +struct rcu_tasks_test_desc {
> > +	struct rcu_head rh;
> > +	const char *name;
> > +	bool notrun;
> > +};
> > +
> > +static struct rcu_tasks_test_desc tests[] = {
> > +	{
> > +		.name = "call_rcu_tasks()",
> > +		/* If not defined, the test is skipped. */
> > +		.notrun = !IS_ENABLED(CONFIG_TASKS_RCU),
> > +	},
> > +	{
> > +		.name = "call_rcu_tasks_rude()",
> > +		/* If not defined, the test is skipped. */
> > +		.notrun = !IS_ENABLED(CONFIG_TASKS_RUDE_RCU),
> > +	},
> > +	{
> > +		.name = "call_rcu_tasks_trace()",
> > +		/* If not defined, the test is skipped. */
> > +		.notrun = !IS_ENABLED(CONFIG_TASKS_TRACE_RCU)
> > +	}
> > +};
> > +
> > +static void test_rcu_tasks_callback(struct rcu_head *rhp)
> > +{
> > +	struct rcu_tasks_test_desc *rttd =
> > +		container_of(rhp, struct rcu_tasks_test_desc, rh);
> > +
> > +	pr_info("Callback from %s invoked.\n", rttd->name);
> That is fine! We can output the name instead of executed counter.
> Doing so makes it completely clear who triggers the callback.

And we also need to make it not trigger when CONFIG_PROVE_RCU=n.
While in the area, we might as well leave anything that is needed only
by CONFIG_PROVE_RCU=y undefined when CONFIG_PROVE_RCU=n.

How about the following?

							Thanx, Paul

------------------------------------------------------------------------

commit f7a1ac0d3504e0518745da7f98573c1b13587f3e
Author: Uladzislau Rezki (Sony) <urezki@gmail.com>
Date:   Wed Dec 9 21:27:32 2020 +0100

    rcu-tasks: Add RCU-tasks self tests
    
    This commit adds self tests for early-boot use of RCU-tasks grace periods.
    It tests all three variants (Rude, Tasks, and Tasks Trace) and covers
    both synchronous (e.g., synchronize_rcu_tasks()) and asynchronous (e.g.,
    call_rcu_tasks()) grace-period APIs.
    
    Self-tests are run only in kernels built with CONFIG_PROVE_RCU=y.
    
    Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
    [ paulmck: Handle CONFIG_PROVE_RCU=n and identify test cases' callbacks. ]
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index 3660755..af7c194 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -1224,6 +1224,82 @@ void show_rcu_tasks_gp_kthreads(void)
 }
 #endif /* #ifndef CONFIG_TINY_RCU */
 
+#ifdef CONFIG_PROVE_RCU
+struct rcu_tasks_test_desc {
+	struct rcu_head rh;
+	const char *name;
+	bool notrun;
+};
+
+static struct rcu_tasks_test_desc tests[] = {
+	{
+		.name = "call_rcu_tasks()",
+		/* If not defined, the test is skipped. */
+		.notrun = !IS_ENABLED(CONFIG_TASKS_RCU),
+	},
+	{
+		.name = "call_rcu_tasks_rude()",
+		/* If not defined, the test is skipped. */
+		.notrun = !IS_ENABLED(CONFIG_TASKS_RUDE_RCU),
+	},
+	{
+		.name = "call_rcu_tasks_trace()",
+		/* If not defined, the test is skipped. */
+		.notrun = !IS_ENABLED(CONFIG_TASKS_TRACE_RCU)
+	}
+};
+
+static void test_rcu_tasks_callback(struct rcu_head *rhp)
+{
+	struct rcu_tasks_test_desc *rttd =
+		container_of(rhp, struct rcu_tasks_test_desc, rh);
+
+	pr_info("Callback from %s invoked.\n", rttd->name);
+
+	rttd->notrun = true;
+}
+
+static void rcu_tasks_initiate_self_tests(void)
+{
+	pr_info("Running RCU-tasks wait API self tests\n");
+#ifdef CONFIG_TASKS_RCU
+	synchronize_rcu_tasks();
+	call_rcu_tasks(&tests[0].rh, test_rcu_tasks_callback);
+#endif
+
+#ifdef CONFIG_TASKS_RUDE_RCU
+	synchronize_rcu_tasks_rude();
+	call_rcu_tasks_rude(&tests[1].rh, test_rcu_tasks_callback);
+#endif
+
+#ifdef CONFIG_TASKS_TRACE_RCU
+	synchronize_rcu_tasks_trace();
+	call_rcu_tasks_trace(&tests[2].rh, test_rcu_tasks_callback);
+#endif
+}
+
+static int rcu_tasks_verify_self_tests(void)
+{
+	int ret = 0;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(tests); i++) {
+		if (!tests[i].notrun) {		// still hanging.
+			pr_err("%s has been failed.\n", tests[i].name);
+			ret = -1;
+		}
+	}
+
+	if (ret)
+		WARN_ON(1);
+
+	return ret;
+}
+late_initcall(rcu_tasks_verify_self_tests);
+#else /* #ifdef CONFIG_PROVE_RCU */
+static void rcu_tasks_initiate_self_tests(void) { }
+#endif /* #else #ifdef CONFIG_PROVE_RCU */
+
 void __init rcu_init_tasks_generic(void)
 {
 #ifdef CONFIG_TASKS_RCU
@@ -1237,6 +1313,9 @@ void __init rcu_init_tasks_generic(void)
 #ifdef CONFIG_TASKS_TRACE_RCU
 	rcu_spawn_tasks_trace_kthread();
 #endif
+
+	// Run the self-tests.
+	rcu_tasks_initiate_self_tests();
 }
 
 #else /* #ifdef CONFIG_TASKS_RCU_GENERIC */

  reply	other threads:[~2020-12-21 19:30 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-09 20:27 [PATCH 1/2] rcu-tasks: move RCU-tasks initialization out of core_initcall() Uladzislau Rezki (Sony)
2020-12-09 20:27 ` [PATCH 2/2] rcu-tasks: add RCU-tasks self tests Uladzislau Rezki (Sony)
2020-12-16 15:49   ` Uladzislau Rezki
2020-12-16 23:29     ` Paul E. McKenney
2020-12-21 15:38       ` Uladzislau Rezki
2020-12-21 17:18         ` Paul E. McKenney
2020-12-21 18:45           ` Uladzislau Rezki
2020-12-21 19:29             ` Paul E. McKenney [this message]
2020-12-21 19:48               ` Uladzislau Rezki
2020-12-21 20:45                 ` Paul E. McKenney
2020-12-21 21:28                   ` Uladzislau Rezki
2021-02-12 19:20   ` Sebastian Andrzej Siewior
2021-02-12 21:12     ` Uladzislau Rezki
2021-02-12 23:48       ` Paul E. McKenney
2021-02-13  0:37         ` Paul E. McKenney
2021-02-13  0:43           ` Paul E. McKenney
2021-02-13 11:30             ` Uladzislau Rezki
2021-02-13 16:45               ` Paul E. McKenney
2021-02-13 20:00                 ` Uladzislau Rezki
2021-02-15 11:28                 ` Sebastian Andrzej Siewior
2021-02-16 17:30                   ` Paul E. McKenney
2021-02-17 14:47                     ` Masami Hiramatsu
2021-02-17 18:17                       ` Paul E. McKenney
2021-02-18  5:03                         ` Masami Hiramatsu
2021-02-18  8:36                           ` Uladzislau Rezki
2021-02-18 14:29                             ` Masami Hiramatsu
2020-12-09 20:37 ` [PATCH 1/2] rcu-tasks: move RCU-tasks initialization out of core_initcall() Uladzislau Rezki
2020-12-10 13:39   ` Daniel Axtens
2020-12-10 17:32     ` Paul E. McKenney
2020-12-10 18:17     ` Uladzislau Rezki
2020-12-10  3:26 ` Paul E. McKenney
2020-12-10 13:04   ` Uladzislau Rezki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201221192906.GX2657@paulmck-ThinkPad-P72 \
    --to=paulmck@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=bigeasy@linutronix.de \
    --cc=dja@axtens.net \
    --cc=frederic@kernel.org \
    --cc=joel@joelfernandes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhocko@suse.com \
    --cc=mpe@ellerman.id.au \
    --cc=neeraju@codeaurora.org \
    --cc=oleksiy.avramchenko@sonymobile.com \
    --cc=peterz@infradead.org \
    --cc=rcu@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tytso@mit.edu \
    --cc=urezki@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.