tizen: Use unique directory prefix for baselibs packages
[platform/kernel/linux-rpi.git] / kernel / torture.c
index b28b05b..c7b4758 100644 (file)
@@ -87,14 +87,15 @@ EXPORT_SYMBOL_GPL(verbose_torout_sleep);
  * nanosecond random fuzz.  This function and its friends desynchronize
  * testing from the timer wheel.
  */
-int torture_hrtimeout_ns(ktime_t baset_ns, u32 fuzzt_ns, struct torture_random_state *trsp)
+int torture_hrtimeout_ns(ktime_t baset_ns, u32 fuzzt_ns, const enum hrtimer_mode mode,
+                        struct torture_random_state *trsp)
 {
        ktime_t hto = baset_ns;
 
        if (trsp)
                hto += torture_random(trsp) % fuzzt_ns;
        set_current_state(TASK_IDLE);
-       return schedule_hrtimeout(&hto, HRTIMER_MODE_REL);
+       return schedule_hrtimeout(&hto, mode);
 }
 EXPORT_SYMBOL_GPL(torture_hrtimeout_ns);
 
@@ -106,7 +107,7 @@ int torture_hrtimeout_us(u32 baset_us, u32 fuzzt_ns, struct torture_random_state
 {
        ktime_t baset_ns = baset_us * NSEC_PER_USEC;
 
-       return torture_hrtimeout_ns(baset_ns, fuzzt_ns, trsp);
+       return torture_hrtimeout_ns(baset_ns, fuzzt_ns, HRTIMER_MODE_REL, trsp);
 }
 EXPORT_SYMBOL_GPL(torture_hrtimeout_us);
 
@@ -123,7 +124,7 @@ int torture_hrtimeout_ms(u32 baset_ms, u32 fuzzt_us, struct torture_random_state
                fuzzt_ns = (u32)~0U;
        else
                fuzzt_ns = fuzzt_us * NSEC_PER_USEC;
-       return torture_hrtimeout_ns(baset_ns, fuzzt_ns, trsp);
+       return torture_hrtimeout_ns(baset_ns, fuzzt_ns, HRTIMER_MODE_REL, trsp);
 }
 EXPORT_SYMBOL_GPL(torture_hrtimeout_ms);
 
@@ -136,7 +137,7 @@ int torture_hrtimeout_jiffies(u32 baset_j, struct torture_random_state *trsp)
 {
        ktime_t baset_ns = jiffies_to_nsecs(baset_j);
 
-       return torture_hrtimeout_ns(baset_ns, jiffies_to_nsecs(1), trsp);
+       return torture_hrtimeout_ns(baset_ns, jiffies_to_nsecs(1), HRTIMER_MODE_REL, trsp);
 }
 EXPORT_SYMBOL_GPL(torture_hrtimeout_jiffies);
 
@@ -153,7 +154,7 @@ int torture_hrtimeout_s(u32 baset_s, u32 fuzzt_ms, struct torture_random_state *
                fuzzt_ns = (u32)~0U;
        else
                fuzzt_ns = fuzzt_ms * NSEC_PER_MSEC;
-       return torture_hrtimeout_ns(baset_ns, fuzzt_ns, trsp);
+       return torture_hrtimeout_ns(baset_ns, fuzzt_ns, HRTIMER_MODE_REL, trsp);
 }
 EXPORT_SYMBOL_GPL(torture_hrtimeout_s);
 
@@ -720,7 +721,7 @@ static void torture_shutdown_cleanup(void)
  * suddenly applied to or removed from the system.
  */
 static struct task_struct *stutter_task;
-static int stutter_pause_test;
+static ktime_t stutter_till_abs_time;
 static int stutter;
 static int stutter_gap;
 
@@ -730,30 +731,16 @@ static int stutter_gap;
  */
 bool stutter_wait(const char *title)
 {
-       unsigned int i = 0;
        bool ret = false;
-       int spt;
+       ktime_t till_ns;
 
        cond_resched_tasks_rcu_qs();
-       spt = READ_ONCE(stutter_pause_test);
-       for (; spt; spt = READ_ONCE(stutter_pause_test)) {
-               if (!ret && !rt_task(current)) {
-                       sched_set_normal(current, MAX_NICE);
-                       ret = true;
-               }
-               if (spt == 1) {
-                       torture_hrtimeout_jiffies(1, NULL);
-               } else if (spt == 2) {
-                       while (READ_ONCE(stutter_pause_test)) {
-                               if (!(i++ & 0xffff))
-                                       torture_hrtimeout_us(10, 0, NULL);
-                               cond_resched();
-                       }
-               } else {
-                       torture_hrtimeout_jiffies(round_jiffies_relative(HZ), NULL);
-               }
-               torture_shutdown_absorb(title);
+       till_ns = READ_ONCE(stutter_till_abs_time);
+       if (till_ns && ktime_before(ktime_get(), till_ns)) {
+               torture_hrtimeout_ns(till_ns, 0, HRTIMER_MODE_ABS, NULL);
+               ret = true;
        }
+       torture_shutdown_absorb(title);
        return ret;
 }
 EXPORT_SYMBOL_GPL(stutter_wait);
@@ -764,23 +751,16 @@ EXPORT_SYMBOL_GPL(stutter_wait);
  */
 static int torture_stutter(void *arg)
 {
-       DEFINE_TORTURE_RANDOM(rand);
-       int wtime;
+       ktime_t till_ns;
 
        VERBOSE_TOROUT_STRING("torture_stutter task started");
        do {
                if (!torture_must_stop() && stutter > 1) {
-                       wtime = stutter;
-                       if (stutter > 2) {
-                               WRITE_ONCE(stutter_pause_test, 1);
-                               wtime = stutter - 3;
-                               torture_hrtimeout_jiffies(wtime, &rand);
-                               wtime = 2;
-                       }
-                       WRITE_ONCE(stutter_pause_test, 2);
-                       torture_hrtimeout_jiffies(wtime, NULL);
+                       till_ns = ktime_add_ns(ktime_get(),
+                                              jiffies_to_nsecs(stutter));
+                       WRITE_ONCE(stutter_till_abs_time, till_ns);
+                       torture_hrtimeout_jiffies(stutter - 1, NULL);
                }
-               WRITE_ONCE(stutter_pause_test, 0);
                if (!torture_must_stop())
                        torture_hrtimeout_jiffies(stutter_gap, NULL);
                torture_shutdown_absorb("torture_stutter");