drm/i915/selftests: try to rein in alloc_smoke
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / selftests / i915_buddy.c
index 1b856ba..939a6ca 100644 (file)
@@ -298,10 +298,12 @@ static void igt_mm_config(u64 *size, u64 *chunk_size)
 static int igt_buddy_alloc_smoke(void *arg)
 {
        struct i915_buddy_mm mm;
-       int max_order;
+       IGT_TIMEOUT(end_time);
+       I915_RND_STATE(prng);
        u64 chunk_size;
        u64 mm_size;
-       int err;
+       int *order;
+       int err, i;
 
        igt_mm_config(&mm_size, &chunk_size);
 
@@ -313,10 +315,16 @@ static int igt_buddy_alloc_smoke(void *arg)
                return err;
        }
 
-       for (max_order = mm.max_order; max_order >= 0; max_order--) {
+       order = i915_random_order(mm.max_order + 1, &prng);
+       if (!order)
+               goto out_fini;
+
+       for (i = 0; i <= mm.max_order; ++i) {
                struct i915_buddy_block *block;
-               int order;
+               int max_order = order[i];
+               bool timeout = false;
                LIST_HEAD(blocks);
+               int order;
                u64 total;
 
                err = igt_check_mm(&mm);
@@ -360,6 +368,11 @@ retry:
                        }
 
                        total += i915_buddy_block_size(&mm, block);
+
+                       if (__igt_timeout(end_time, NULL)) {
+                               timeout = true;
+                               break;
+                       }
                } while (total < mm.size);
 
                if (!err)
@@ -373,7 +386,7 @@ retry:
                                pr_err("post-mm check failed\n");
                }
 
-               if (err)
+               if (err || timeout)
                        break;
 
                cond_resched();
@@ -382,6 +395,8 @@ retry:
        if (err == -ENOMEM)
                err = 0;
 
+       kfree(order);
+out_fini:
        i915_buddy_fini(&mm);
 
        return err;