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);
 
                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);
                        }
 
                        total += i915_buddy_block_size(&mm, block);
+
+                       if (__igt_timeout(end_time, NULL)) {
+                               timeout = true;
+                               break;
+                       }
                } while (total < mm.size);
 
                if (!err)
                                pr_err("post-mm check failed\n");
                }
 
-               if (err)
+               if (err || timeout)
                        break;
 
                cond_resched();
        if (err == -ENOMEM)
                err = 0;
 
+       kfree(order);
+out_fini:
        i915_buddy_fini(&mm);
 
        return err;