Commit b8726c5a authored by Paul E. McKenney's avatar Paul E. McKenney Committed by Boqun Feng
Browse files

rcutorture: Add a test_boost_holdoff module parameter



This commit adds a test_boost_holdoff module parameter that tells the RCU
priority-boosting tests to wait for the specified number of seconds past
the start of the rcutorture test.  This can be useful when rcutorture
is built into the kernel (as opposed to being modprobed), especially on
large systems where early start of RCU priority boosting can delay the
boot sequence, which adds a full CPU's worth of load onto the system.
This can in turn result in pointless stall warnings.

Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
Signed-off-by: default avatarBoqun Feng <boqun.feng@gmail.com>
parent 623b5280
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -5758,6 +5758,11 @@
	rcutorture.test_boost_duration= [KNL]
			Duration (s) of each individual boost test.

	rcutorture.test_boost_holdoff= [KNL]
			Holdoff time (s) from start of test to the start
			of RCU priority-boost testing.	Defaults to zero,
			that is, no holdoff.

	rcutorture.test_boost_interval= [KNL]
			Interval (s) between each boost test.

+16 −3
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ torture_param(int, stat_interval, 60, "Number of seconds between stats printk()s
torture_param(int, stutter, 5, "Number of seconds to run/halt test");
torture_param(int, test_boost, 1, "Test RCU prio boost: 0=no, 1=maybe, 2=yes.");
torture_param(int, test_boost_duration, 4, "Duration of each boost test, seconds.");
torture_param(int, test_boost_holdoff, 0, "Holdoff time from rcutorture start, seconds.");
torture_param(int, test_boost_interval, 7, "Interval between boost tests, seconds.");
torture_param(int, test_nmis, 0, "End-test NMI tests, 0 to disable.");
torture_param(bool, test_no_idle_hz, true, "Test support for tickless idle CPUs");
@@ -1148,8 +1149,19 @@ static int rcu_torture_boost(void *arg)
	unsigned long gp_state;
	unsigned long gp_state_time;
	unsigned long oldstarttime;
	unsigned long booststarttime = get_torture_init_jiffies() + test_boost_holdoff * HZ;

	if (test_boost_holdoff <= 0 || time_after(jiffies, booststarttime)) {
		VERBOSE_TOROUT_STRING("rcu_torture_boost started");
	} else {
		VERBOSE_TOROUT_STRING("rcu_torture_boost started holdoff period");
		while (time_before(jiffies, booststarttime)) {
			schedule_timeout_idle(HZ);
			if (kthread_should_stop())
				goto cleanup;
		}
		VERBOSE_TOROUT_STRING("rcu_torture_boost finished holdoff period");
	}

	/* Set real-time priority. */
	sched_set_fifo_low(current);
@@ -1225,6 +1237,7 @@ checkwait: if (stutter_wait("rcu_torture_boost"))
			sched_set_fifo_low(current);
	} while (!torture_must_stop());

cleanup:
	/* Clean up and exit. */
	while (!kthread_should_stop()) {
		torture_shutdown_absorb("rcu_torture_boost");
@@ -2512,7 +2525,7 @@ rcu_torture_print_module_parms(struct rcu_torture_ops *cur_ops, const char *tag)
		 "shuffle_interval=%d stutter=%d irqreader=%d "
		 "fqs_duration=%d fqs_holdoff=%d fqs_stutter=%d "
		 "test_boost=%d/%d test_boost_interval=%d "
		 "test_boost_duration=%d shutdown_secs=%d "
		 "test_boost_duration=%d test_boost_holdoff=%d shutdown_secs=%d "
		 "stall_cpu=%d stall_cpu_holdoff=%d stall_cpu_irqsoff=%d "
		 "stall_cpu_block=%d stall_cpu_repeat=%d "
		 "n_barrier_cbs=%d "
@@ -2526,7 +2539,7 @@ rcu_torture_print_module_parms(struct rcu_torture_ops *cur_ops, const char *tag)
		 stat_interval, verbose, test_no_idle_hz, shuffle_interval,
		 stutter, irqreader, fqs_duration, fqs_holdoff, fqs_stutter,
		 test_boost, cur_ops->can_boost,
		 test_boost_interval, test_boost_duration, shutdown_secs,
		 test_boost_interval, test_boost_duration, test_boost_holdoff, shutdown_secs,
		 stall_cpu, stall_cpu_holdoff, stall_cpu_irqsoff,
		 stall_cpu_block, stall_cpu_repeat,
		 n_barrier_cbs,