| RCU Torture Test Operation | 
 |  | 
 |  | 
 | CONFIG_RCU_TORTURE_TEST | 
 |  | 
 | The CONFIG_RCU_TORTURE_TEST config option is available for all RCU | 
 | implementations.  It creates an rcutorture kernel module that can | 
 | be loaded to run a torture test.  The test periodically outputs | 
 | status messages via printk(), which can be examined via the dmesg | 
 | command (perhaps grepping for "torture").  The test is started | 
 | when the module is loaded, and stops when the module is unloaded. | 
 |  | 
 | 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 | 
 |  | 
 | This module has the following parameters: | 
 |  | 
 | fqs_duration	Duration (in microseconds) of artificially induced bursts | 
 | 		of force_quiescent_state() invocations.  In RCU | 
 | 		implementations having force_quiescent_state(), these | 
 | 		bursts help force races between forcing a given grace | 
 | 		period and that grace period ending on its own. | 
 |  | 
 | fqs_holdoff	Holdoff time (in microseconds) between consecutive calls | 
 | 		to force_quiescent_state() within a burst. | 
 |  | 
 | fqs_stutter	Wait time (in seconds) between consecutive bursts | 
 | 		of calls to force_quiescent_state(). | 
 |  | 
 | gp_normal	Make the fake writers use normal synchronous grace-period | 
 | 		primitives. | 
 |  | 
 | gp_exp		Make the fake writers use expedited synchronous grace-period | 
 | 		primitives.  If both gp_normal and gp_exp are set, or | 
 | 		if neither gp_normal nor gp_exp are set, then randomly | 
 | 		choose the primitive so that about 50% are normal and | 
 | 		50% expedited.  By default, neither are set, which | 
 | 		gives best overall test coverage. | 
 |  | 
 | irqreader	Says to invoke RCU readers from irq level.  This is currently | 
 | 		done via timers.  Defaults to "1" for variants of RCU that | 
 | 		permit this.  (Or, more accurately, variants of RCU that do | 
 | 		-not- permit this know to ignore this variable.) | 
 |  | 
 | n_barrier_cbs	If this is nonzero, RCU barrier testing will be conducted, | 
 | 		in which case n_barrier_cbs specifies the number of | 
 | 		RCU callbacks (and corresponding kthreads) to use for | 
 | 		this testing.  The value cannot be negative.  If you | 
 | 		specify this to be non-zero when torture_type indicates a | 
 | 		synchronous RCU implementation (one for which a member of | 
 | 		the synchronize_rcu() rather than the call_rcu() family is | 
 | 		used -- see the documentation for torture_type below), an | 
 | 		error will be reported and no testing will be carried out. | 
 |  | 
 | nfakewriters	This is the number of RCU fake writer threads to run.  Fake | 
 | 		writer threads repeatedly use the synchronous "wait for | 
 | 		current readers" function of the interface selected by | 
 | 		torture_type, with a delay between calls to allow for various | 
 | 		different numbers of writers running in parallel. | 
 | 		nfakewriters defaults to 4, which provides enough parallelism | 
 | 		to trigger special cases caused by multiple writers, such as | 
 | 		the synchronize_srcu() early return optimization. | 
 |  | 
 | nreaders	This is the number of RCU reading threads supported. | 
 | 		The default is twice the number of CPUs.  Why twice? | 
 | 		To properly exercise RCU implementations with preemptible | 
 | 		read-side critical sections. | 
 |  | 
 | onoff_interval | 
 | 		The number of seconds between each attempt to execute a | 
 | 		randomly selected CPU-hotplug operation.  Defaults to | 
 | 		zero, which disables CPU hotplugging.  In HOTPLUG_CPU=n | 
 | 		kernels, rcutorture will silently refuse to do any | 
 | 		CPU-hotplug operations regardless of what value is | 
 | 		specified for onoff_interval. | 
 |  | 
 | onoff_holdoff	The number of seconds to wait until starting CPU-hotplug | 
 | 		operations.  This would normally only be used when | 
 | 		rcutorture was built into the kernel and started | 
 | 		automatically at boot time, in which case it is useful | 
 | 		in order to avoid confusing boot-time code with CPUs | 
 | 		coming and going. | 
 |  | 
 | shuffle_interval | 
 | 		The number of seconds to keep the test threads affinitied | 
 | 		to a particular subset of the CPUs, defaults to 3 seconds. | 
 | 		Used in conjunction with test_no_idle_hz. | 
 |  | 
 | shutdown_secs	The number of seconds to run the test before terminating | 
 | 		the test and powering off the system.  The default is | 
 | 		zero, which disables test termination and system shutdown. | 
 | 		This capability is useful for automated testing. | 
 |  | 
 | stall_cpu	The number of seconds that a CPU should be stalled while | 
 | 		within both an rcu_read_lock() and a preempt_disable(). | 
 | 		This stall happens only once per rcutorture run. | 
 | 		If you need multiple stalls, use modprobe and rmmod to | 
 | 		repeatedly run rcutorture.  The default for stall_cpu | 
 | 		is zero, which prevents rcutorture from stalling a CPU. | 
 |  | 
 | 		Note that attempts to rmmod rcutorture while the stall | 
 | 		is ongoing will hang, so be careful what value you | 
 | 		choose for this module parameter!  In addition, too-large | 
 | 		values for stall_cpu might well induce failures and | 
 | 		warnings in other parts of the kernel.  You have been | 
 | 		warned! | 
 |  | 
 | stall_cpu_holdoff | 
 | 		The number of seconds to wait after rcutorture starts | 
 | 		before stalling a CPU.  Defaults to 10 seconds. | 
 |  | 
 | stat_interval	The number of seconds between output of torture | 
 | 		statistics (via printk()).  Regardless of the interval, | 
 | 		statistics are printed when the module is unloaded. | 
 | 		Setting the interval to zero causes the statistics to | 
 | 		be printed -only- when the module is unloaded, and this | 
 | 		is the default. | 
 |  | 
 | stutter		The length of time to run the test before pausing for this | 
 | 		same period of time.  Defaults to "stutter=5", so as | 
 | 		to run and pause for (roughly) five-second intervals. | 
 | 		Specifying "stutter=0" causes the test to run continuously | 
 | 		without pausing, which is the old default behavior. | 
 |  | 
 | test_boost	Whether or not to test the ability of RCU to do priority | 
 | 		boosting.  Defaults to "test_boost=1", which performs | 
 | 		RCU priority-inversion testing only if the selected | 
 | 		RCU implementation supports priority boosting.  Specifying | 
 | 		"test_boost=0" never performs RCU priority-inversion | 
 | 		testing.  Specifying "test_boost=2" performs RCU | 
 | 		priority-inversion testing even if the selected RCU | 
 | 		implementation does not support RCU priority boosting, | 
 | 		which can be used to test rcutorture's ability to | 
 | 		carry out RCU priority-inversion testing. | 
 |  | 
 | test_boost_interval | 
 | 		The number of seconds in an RCU priority-inversion test | 
 | 		cycle.	Defaults to "test_boost_interval=7".  It is | 
 | 		usually wise for this value to be relatively prime to | 
 | 		the value selected for "stutter". | 
 |  | 
 | test_boost_duration | 
 | 		The number of seconds to do RCU priority-inversion testing | 
 | 		within any given "test_boost_interval".  Defaults to | 
 | 		"test_boost_duration=4". | 
 |  | 
 | test_no_idle_hz	Whether or not to test the ability of RCU to operate in | 
 | 		a kernel that disables the scheduling-clock interrupt to | 
 | 		idle CPUs.  Boolean parameter, "1" to test, "0" otherwise. | 
 | 		Defaults to omitting this test. | 
 |  | 
 | torture_type	The type of RCU to test, with string values as follows: | 
 |  | 
 | 		"rcu":  rcu_read_lock(), rcu_read_unlock() and call_rcu(), | 
 | 			along with expedited, synchronous, and polling | 
 | 			variants. | 
 |  | 
 | 		"rcu_bh": rcu_read_lock_bh(), rcu_read_unlock_bh(), and | 
 | 			call_rcu_bh(), along with expedited and synchronous | 
 | 			variants. | 
 |  | 
 | 		"rcu_busted": This tests an intentionally incorrect version | 
 | 			of RCU in order to help test rcutorture itself. | 
 |  | 
 | 		"srcu": srcu_read_lock(), srcu_read_unlock() and | 
 | 			call_srcu(), along with expedited and | 
 | 			synchronous variants. | 
 |  | 
 | 		"sched": preempt_disable(), preempt_enable(), and | 
 | 			call_rcu_sched(), along with expedited, | 
 | 			synchronous, and polling variants. | 
 |  | 
 | 		"tasks": voluntary context switch and call_rcu_tasks(), | 
 | 			along with expedited and synchronous variants. | 
 |  | 
 | 		Defaults to "rcu". | 
 |  | 
 | verbose		Enable debug printk()s.  Default is disabled. | 
 |  | 
 |  | 
 | OUTPUT | 
 |  | 
 | The statistics output is as follows: | 
 |  | 
 | 	rcu-torture:--- Start of test: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4 | 
 | 	rcu-torture: rtc:           (null) ver: 155441 tfle: 0 rta: 155441 rtaf: 8884 rtf: 155440 rtmbe: 0 rtbe: 0 rtbke: 0 rtbre: 0 rtbf: 0 rtb: 0 nt: 3055767 | 
 | 	rcu-torture: Reader Pipe:  727860534 34213 0 0 0 0 0 0 0 0 0 | 
 | 	rcu-torture: Reader Batch:  727877838 17003 0 0 0 0 0 0 0 0 0 | 
 | 	rcu-torture: Free-Block Circulation:  155440 155440 155440 155440 155440 155440 155440 155440 155440 155440 0 | 
 | 	rcu-torture:--- End of test: SUCCESS: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4 | 
 |  | 
 | The command "dmesg | grep torture:" will extract this information on | 
 | most systems.  On more esoteric configurations, it may be necessary to | 
 | use other commands to access the output of the printk()s used by | 
 | the RCU torture test.  The printk()s use KERN_ALERT, so they should | 
 | be evident.  ;-) | 
 |  | 
 | The first and last lines show the rcutorture module parameters, and the | 
 | last line shows either "SUCCESS" or "FAILURE", based on rcutorture's | 
 | automatic determination as to whether RCU operated correctly. | 
 |  | 
 | The entries are as follows: | 
 |  | 
 | o	"rtc": The hexadecimal address of the structure currently visible | 
 | 	to readers. | 
 |  | 
 | o	"ver": The number of times since boot that the RCU writer task | 
 | 	has changed the structure visible to readers. | 
 |  | 
 | o	"tfle": If non-zero, indicates that the "torture freelist" | 
 | 	containing structures to be placed into the "rtc" area is empty. | 
 | 	This condition is important, since it can fool you into thinking | 
 | 	that RCU is working when it is not.  :-/ | 
 |  | 
 | o	"rta": Number of structures allocated from the torture freelist. | 
 |  | 
 | o	"rtaf": Number of allocations from the torture freelist that have | 
 | 	failed due to the list being empty.  It is not unusual for this | 
 | 	to be non-zero, but it is bad for it to be a large fraction of | 
 | 	the value indicated by "rta". | 
 |  | 
 | o	"rtf": Number of frees into the torture freelist. | 
 |  | 
 | o	"rtmbe": A non-zero value indicates that rcutorture believes that | 
 | 	rcu_assign_pointer() and rcu_dereference() are not working | 
 | 	correctly.  This value should be zero. | 
 |  | 
 | o	"rtbe": A non-zero value indicates that one of the rcu_barrier() | 
 | 	family of functions is not working correctly. | 
 |  | 
 | o	"rtbke": rcutorture was unable to create the real-time kthreads | 
 | 	used to force RCU priority inversion.  This value should be zero. | 
 |  | 
 | o	"rtbre": Although rcutorture successfully created the kthreads | 
 | 	used to force RCU priority inversion, it was unable to set them | 
 | 	to the real-time priority level of 1.  This value should be zero. | 
 |  | 
 | o	"rtbf": The number of times that RCU priority boosting failed | 
 | 	to resolve RCU priority inversion. | 
 |  | 
 | o	"rtb": The number of times that rcutorture attempted to force | 
 | 	an RCU priority inversion condition.  If you are testing RCU | 
 | 	priority boosting via the "test_boost" module parameter, this | 
 | 	value should be non-zero. | 
 |  | 
 | o	"nt": The number of times rcutorture ran RCU read-side code from | 
 | 	within a timer handler.  This value should be non-zero only | 
 | 	if you specified the "irqreader" module parameter. | 
 |  | 
 | o	"Reader Pipe": Histogram of "ages" of structures seen by readers. | 
 | 	If any entries past the first two are non-zero, RCU is broken. | 
 | 	And rcutorture prints the error flag string "!!!" to make sure | 
 | 	you notice.  The age of a newly allocated structure is zero, | 
 | 	it becomes one when removed from reader visibility, and is | 
 | 	incremented once per grace period subsequently -- and is freed | 
 | 	after passing through (RCU_TORTURE_PIPE_LEN-2) grace periods. | 
 |  | 
 | 	The output displayed above was taken from a correctly working | 
 | 	RCU.  If you want to see what it looks like when broken, break | 
 | 	it yourself.  ;-) | 
 |  | 
 | o	"Reader Batch": Another histogram of "ages" of structures seen | 
 | 	by readers, but in terms of counter flips (or batches) rather | 
 | 	than in terms of grace periods.  The legal number of non-zero | 
 | 	entries is again two.  The reason for this separate view is that | 
 | 	it is sometimes easier to get the third entry to show up in the | 
 | 	"Reader Batch" list than in the "Reader Pipe" list. | 
 |  | 
 | o	"Free-Block Circulation": Shows the number of torture structures | 
 | 	that have reached a given point in the pipeline.  The first element | 
 | 	should closely correspond to the number of structures allocated, | 
 | 	the second to the number that have been removed from reader view, | 
 | 	and all but the last remaining to the corresponding number of | 
 | 	passes through a grace period.  The last entry should be zero, | 
 | 	as it is only incremented if a torture structure's counter | 
 | 	somehow gets incremented farther than it should. | 
 |  | 
 | Different implementations of RCU can provide implementation-specific | 
 | additional information.  For example, SRCU provides the following | 
 | additional line: | 
 |  | 
 | 	srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1) | 
 |  | 
 | This line shows the per-CPU counter state.  The numbers in parentheses are | 
 | the values of the "old" and "current" counters for the corresponding CPU. | 
 | The "idx" value maps the "old" and "current" values to the underlying | 
 | array, and is useful for debugging. | 
 |  | 
 |  | 
 | USAGE | 
 |  | 
 | The following script may be used to torture RCU: | 
 |  | 
 | 	#!/bin/sh | 
 |  | 
 | 	modprobe rcutorture | 
 | 	sleep 3600 | 
 | 	rmmod rcutorture | 
 | 	dmesg | grep torture: | 
 |  | 
 | The output can be manually inspected for the error flag of "!!!". | 
 | One could of course create a more elaborate script that automatically | 
 | checked for such errors.  The "rmmod" command forces a "SUCCESS", | 
 | "FAILURE", or "RCU_HOTPLUG" indication to be printk()ed.  The first | 
 | two are self-explanatory, while the last indicates that while there | 
 | were no RCU failures, CPU-hotplug problems were detected. |