]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
drm/i915/selftests: Disable preemption while setting up fence-timers
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 13 Mar 2019 20:59:44 +0000 (20:59 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 14 Mar 2019 11:47:06 +0000 (11:47 +0000)
The impossible happens and a future fence expired while we were still
initialising. The probable cause is that the test was preempted and we
lost our scheduler cpu slice. Disable preemption during this test to
rule out preemption as a source of timer disruption.

References: https://bugs.freedesktop.org/show_bug.cgi?id=110039
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190313205944.5768-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/selftests/i915_sw_fence.c

index cdbc8f134e5e47a60e021be30f5aa9160283b947..cbf45d85cbff4ae0c83b6feafa40b1b7ef2f0139 100644 (file)
@@ -571,21 +571,27 @@ static int test_timer(void *arg)
        unsigned long target, delay;
        struct timed_fence tf;
 
+       preempt_disable();
        timed_fence_init(&tf, target = jiffies);
        if (!i915_sw_fence_done(&tf.fence)) {
                pr_err("Fence with immediate expiration not signaled\n");
                goto err;
        }
+       preempt_enable();
        timed_fence_fini(&tf);
 
        for_each_prime_number(delay, i915_selftest.timeout_jiffies/2) {
+               preempt_disable();
                timed_fence_init(&tf, target = jiffies + delay);
                if (i915_sw_fence_done(&tf.fence)) {
                        pr_err("Fence with future expiration (%lu jiffies) already signaled\n", delay);
                        goto err;
                }
+               preempt_enable();
 
                i915_sw_fence_wait(&tf.fence);
+
+               preempt_disable();
                if (!i915_sw_fence_done(&tf.fence)) {
                        pr_err("Fence not signaled after wait\n");
                        goto err;
@@ -595,13 +601,14 @@ static int test_timer(void *arg)
                               target, jiffies);
                        goto err;
                }
-
+               preempt_enable();
                timed_fence_fini(&tf);
        }
 
        return 0;
 
 err:
+       preempt_enable();
        timed_fence_fini(&tf);
        return -EINVAL;
 }