torture: Throttle VERBOSE_TOROUT_*() output
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 25 Nov 2020 21:00:04 +0000 (13:00 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 7 Jan 2021 01:17:21 +0000 (17:17 -0800)
This commit adds kernel boot parameters torture.verbose_sleep_frequency
and torture.verbose_sleep_duration, which allow VERBOSE_TOROUT_*() output
to be throttled with periodic sleeps on large systems.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Documentation/admin-guide/kernel-parameters.txt
include/linux/torture.h
kernel/torture.c

index 3244f9e..18f3aa7 100644 (file)
                        are running concurrently, especially on systems
                        with rotating-rust storage.
 
+       torture.verbose_sleep_frequency= [KNL]
+                       Specifies how many verbose printk()s should be
+                       emitted between each sleep.  The default of zero
+                       disables verbose-printk() sleeping.
+
+       torture.verbose_sleep_duration= [KNL]
+                       Duration of each verbose-printk() sleep in jiffies.
+
        tp720=          [HW,PS2]
 
        tpm_suspend_pcr=[HW,TPM]
index 32941f8..d62d13c 100644 (file)
 #define TOROUT_STRING(s) \
        pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, s)
 #define VERBOSE_TOROUT_STRING(s) \
-       do { if (verbose) pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, s); } while (0)
+do {                                                                           \
+       if (verbose) {                                                          \
+               verbose_torout_sleep();                                         \
+               pr_alert("%s" TORTURE_FLAG " %s\n", torture_type, s);           \
+       }                                                                       \
+} while (0)
 #define VERBOSE_TOROUT_ERRSTRING(s) \
-       do { if (verbose) pr_alert("%s" TORTURE_FLAG "!!! %s\n", torture_type, s); } while (0)
+do {                                                                           \
+       if (verbose) {                                                          \
+               verbose_torout_sleep();                                         \
+               pr_alert("%s" TORTURE_FLAG "!!! %s\n", torture_type, s);        \
+       }                                                                       \
+} while (0)
+void verbose_torout_sleep(void);
 
 /* Definitions for online/offline exerciser. */
 typedef void torture_ofl_func(void);
index 7ad5c96..93eeeb2 100644 (file)
@@ -48,6 +48,12 @@ module_param(disable_onoff_at_boot, bool, 0444);
 static bool ftrace_dump_at_shutdown;
 module_param(ftrace_dump_at_shutdown, bool, 0444);
 
+static int verbose_sleep_frequency;
+module_param(verbose_sleep_frequency, int, 0444);
+
+static int verbose_sleep_duration = 1;
+module_param(verbose_sleep_duration, int, 0444);
+
 static char *torture_type;
 static int verbose;
 
@@ -58,6 +64,20 @@ static int verbose;
 static int fullstop = FULLSTOP_RMMOD;
 static DEFINE_MUTEX(fullstop_mutex);
 
+static atomic_t verbose_sleep_counter;
+
+/*
+ * Sleep if needed from VERBOSE_TOROUT*().
+ */
+void verbose_torout_sleep(void)
+{
+       if (verbose_sleep_frequency > 0 &&
+           verbose_sleep_duration > 0 &&
+           !(atomic_inc_return(&verbose_sleep_counter) % verbose_sleep_frequency))
+               schedule_timeout_uninterruptible(verbose_sleep_duration);
+}
+EXPORT_SYMBOL_GPL(verbose_torout_sleep);
+
 /*
  * Schedule a high-resolution-timer sleep in nanoseconds, with a 32-bit
  * nanosecond random fuzz.  This function and its friends desynchronize