Messages in this thread Patch in this message | | | Date | Thu, 19 Jun 2008 22:47:24 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH] Make rcutorture more vicious: reinstate boot-time testing |
| |
On Thu, Jun 19, 2008 at 02:17:25PM -0700, Randy Dunlap wrote: > On Thu, 19 Jun 2008 08:58:54 -0700 Paul E. McKenney wrote: > > > On Thu, Jun 19, 2008 at 11:29:14AM +0200, Ingo Molnar wrote: > > > > > > * Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote: > > > > > > > Hello again! > > > > > > > > Documentation/RCU/torture.txt | 21 > > Documentation/RCU/torture.txt.orig | 8 > ~~~~~ > > > kernel/rcutorture.c | 14 > > kernel/rcutorture.c.orig | 59 > !!!! > > > kernel/sysctl.c | 13 > > kernel/sysctl.c.orig | 2851 +++++++++++++++++++++++++++++++++++++ > ~~~~ > > > lib/Kconfig.debug | 20 > > lib/Kconfig.debug.orig | 679 ++++++++ > ~~~~ > > What's with all of these .orig files, eh??
Gah, typos generating the diffs. :-/
> > 8 files changed, 3651 insertions(+), 14 deletions(-)
How about the following instead? (I expect to be following up with a version that gets rid of the threads in response to writing a "0" to /proc/sys/kernel/rcutorture_runnable later on.)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> ---
Documentation/RCU/torture.txt | 21 ++++++++++++++------- kernel/rcutorture.c | 14 ++++++++++++-- kernel/sysctl.c | 13 +++++++++++++ lib/Kconfig.debug | 20 +++++++++++++++++++- 4 files changed, 58 insertions(+), 10 deletions(-)
diff -urpNa -X dontdiff linux-2.6.26-rc4-rcut1-stutter/Documentation/RCU/torture.txt linux-2.6.26-rc4-rcut2-proc/Documentation/RCU/torture.txt --- linux-2.6.26-rc4-rcut1-stutter/Documentation/RCU/torture.txt 2008-06-18 05:15:43.000000000 -0700 +++ linux-2.6.26-rc4-rcut2-proc/Documentation/RCU/torture.txt 2008-06-18 08:11:19.000000000 -0700 @@ -10,13 +10,20 @@ status messages via printk(), which can command (perhaps grepping for "torture"). The test is started when the module is loaded, and stops when the module is unloaded. -However, actually setting this config option to "y" results in the system -running the test immediately upon boot, and ending only when the system -is taken down. Normally, one will instead want to build the system -with CONFIG_RCU_TORTURE_TEST=m and to use modprobe and rmmod to control -the test, perhaps using a script similar to the one shown at the end of -this document. Note that you will need CONFIG_MODULE_UNLOAD in order -to be able to end the test. +CONFIG_RCU_TORTURE_TEST_RUNNABLE + +It is also possible to specify CONFIG_RCU_TORTURE_TEST=y, which will +result in the tests being loaded into the base kernel. In this case, +the CONFIG_RCU_TORTURE_TEST_RUNNABLE config option is used to specify +whether the RCU torture tests are to be started immediately during +boot or whether the /proc/sys/kernel/rcutorture_runnable file is used +to enable them. This /proc file can be used to repeatedly pause and +restart the tests, regardless of the initial state specified by the +CONFIG_RCU_TORTURE_TEST_RUNNABLE config option. + +You will normally -not- want to start the RCU torture tests during boot +(and thus the default is CONFIG_RCU_TORTURE_TEST_RUNNABLE=n), but doing +this can sometimes be useful in finding boot-time bugs. MODULE PARAMETERS diff -urpNa -X dontdiff linux-2.6.26-rc4-rcut1-stutter/kernel/rcutorture.c linux-2.6.26-rc4-rcut2-proc/kernel/rcutorture.c --- linux-2.6.26-rc4-rcut1-stutter/kernel/rcutorture.c 2008-06-18 04:54:41.000000000 -0700 +++ linux-2.6.26-rc4-rcut2-proc/kernel/rcutorture.c 2008-06-19 04:48:56.000000000 -0700 @@ -125,6 +125,13 @@ static struct list_head rcu_torture_remo static int stutter_pause_test = 0; +#if defined(MODULE) || defined(CONFIG_RCU_TORTURE_TEST_RUNNABLE) +#define RCUTORTURE_RUNNABLE_INIT 1 +#else +#define RCUTORTURE_RUNNABLE_INIT 0 +#endif +int rcutorture_runnable = RCUTORTURE_RUNNABLE_INIT; + /* * Allocate an element from the rcu_tortures pool. */ @@ -188,8 +195,11 @@ rcu_random(struct rcu_random_state *rrsp static void rcu_stutter_wait(void) { - while (stutter_pause_test) - schedule_timeout_interruptible(1); + while (stutter_pause_test || !rcutorture_runnable) + if (rcutorture_runnable) + schedule_timeout_interruptible(1); + else + schedule_timeout_interruptible(HZ); } /* diff -urpNa -X dontdiff linux-2.6.26-rc4-rcut1-stutter/kernel/sysctl.c linux-2.6.26-rc4-rcut2-proc/kernel/sysctl.c --- linux-2.6.26-rc4-rcut1-stutter/kernel/sysctl.c 2008-05-30 04:39:01.000000000 -0700 +++ linux-2.6.26-rc4-rcut2-proc/kernel/sysctl.c 2008-06-18 07:35:26.000000000 -0700 @@ -82,6 +82,9 @@ extern int maps_protect; extern int sysctl_stat_interval; extern int latencytop_enabled; extern int sysctl_nr_open_min, sysctl_nr_open_max; +#ifdef CONFIG_RCU_TORTURE_TEST +extern int rcutorture_runnable; +#endif /* #ifdef CONFIG_RCU_TORTURE_TEST */ /* Constants used for minimum and maximum */ #if defined(CONFIG_DETECT_SOFTLOCKUP) || defined(CONFIG_HIGHMEM) @@ -813,6 +816,16 @@ static struct ctl_table kern_table[] = { .child = key_sysctls, }, #endif +#ifdef CONFIG_RCU_TORTURE_TEST + { + .ctl_name = CTL_UNNUMBERED, + .procname = "rcutorture_runnable", + .data = &rcutorture_runnable, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, +#endif /* * NOTE: do not add new entries to this table unless you have read * Documentation/sysctl/ctl_unnumbered.txt diff -urpNa -X dontdiff linux-2.6.26-rc4-rcut1-stutter/lib/Kconfig.debug linux-2.6.26-rc4-rcut2-proc/lib/Kconfig.debug --- linux-2.6.26-rc4-rcut1-stutter/lib/Kconfig.debug 2008-05-30 04:39:01.000000000 -0700 +++ linux-2.6.26-rc4-rcut2-proc/lib/Kconfig.debug 2008-06-18 06:32:48.000000000 -0700 @@ -531,16 +531,34 @@ config BOOT_PRINTK_DELAY config RCU_TORTURE_TEST tristate "torture tests for RCU" depends on DEBUG_KERNEL - depends on m default n help This option provides a kernel module that runs torture tests on the RCU infrastructure. The kernel module may be built after the fact on the running kernel to be tested, if desired. + Say Y here if you want RCU torture tests to be built into + the kernel. Say M if you want the RCU torture tests to build as a module. Say N if you are unsure. +config RCU_TORTURE_TEST_RUNNABLE + bool "torture tests for RCU runnable by default" + depends on RCU_TORTURE_TEST = y + default n + help + This option provides a way to build the RCU torture tests + directly into the kernel without them starting up at boot + time. You can use /proc/sys/kernel/rcutorture_runnable + to manually override this setting. This /proc file is + available only when the RCU torture tests have been built + into the kernel. + + Say Y here if you want the RCU torture tests to start during + boot (you probably don't). + Say N here if you want the RCU torture tests to start only + after being manually enabled via /proc. + config KPROBES_SANITY_TEST bool "Kprobes sanity tests" depends on DEBUG_KERNEL
| |