Merge tag 'gpio-v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux...
[sfrench/cifs-2.6.git] / kernel / torture.c
index 17b2be9bde12aa22a010788a2143eeedddc3a6c3..a8d9bdfba7c37280cb335bf6c4aeca615d05dcbb 100644 (file)
@@ -570,6 +570,7 @@ static void torture_shutdown_cleanup(void)
 static struct task_struct *stutter_task;
 static int stutter_pause_test;
 static int stutter;
+static int stutter_gap;
 
 /*
  * Block until the stutter interval ends.  This must be called periodically
@@ -578,10 +579,12 @@ static int stutter;
 bool stutter_wait(const char *title)
 {
        int spt;
+       bool ret = false;
 
        cond_resched_tasks_rcu_qs();
        spt = READ_ONCE(stutter_pause_test);
        for (; spt; spt = READ_ONCE(stutter_pause_test)) {
+               ret = true;
                if (spt == 1) {
                        schedule_timeout_interruptible(1);
                } else if (spt == 2) {
@@ -592,7 +595,7 @@ bool stutter_wait(const char *title)
                }
                torture_shutdown_absorb(title);
        }
-       return !!spt;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(stutter_wait);
 
@@ -602,17 +605,24 @@ EXPORT_SYMBOL_GPL(stutter_wait);
  */
 static int torture_stutter(void *arg)
 {
+       int wtime;
+
        VERBOSE_TOROUT_STRING("torture_stutter task started");
        do {
                if (!torture_must_stop() && stutter > 1) {
-                       WRITE_ONCE(stutter_pause_test, 1);
-                       schedule_timeout_interruptible(stutter - 1);
+                       wtime = stutter;
+                       if (stutter > HZ + 1) {
+                               WRITE_ONCE(stutter_pause_test, 1);
+                               wtime = stutter - HZ - 1;
+                               schedule_timeout_interruptible(wtime);
+                               wtime = HZ + 1;
+                       }
                        WRITE_ONCE(stutter_pause_test, 2);
-                       schedule_timeout_interruptible(1);
+                       schedule_timeout_interruptible(wtime);
                }
                WRITE_ONCE(stutter_pause_test, 0);
                if (!torture_must_stop())
-                       schedule_timeout_interruptible(stutter);
+                       schedule_timeout_interruptible(stutter_gap);
                torture_shutdown_absorb("torture_stutter");
        } while (!torture_must_stop());
        torture_kthread_stopping("torture_stutter");
@@ -622,9 +632,10 @@ static int torture_stutter(void *arg)
 /*
  * Initialize and kick off the torture_stutter kthread.
  */
-int torture_stutter_init(const int s)
+int torture_stutter_init(const int s, const int sgap)
 {
        stutter = s;
+       stutter_gap = sgap;
        return torture_create_kthread(torture_stutter, NULL, stutter_task);
 }
 EXPORT_SYMBOL_GPL(torture_stutter_init);