The i915_active selftests operate on an active attached to a mock
request. This request is created during the test, and a fence is
attached to it for the test to control when the request is processed.
However, because signalling the fence happens inside the same thread as
the test, and before a call to __i915_active_wait(), a race condition is
created where if the request is processed before the aforementioned
call, the active callback will not be called.

Defer signalling the request's fence, so that the request completes only
after the test's call to __i915_active_wait().

Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14808
Signed-off-by: Krzysztof Niemiec <[email protected]>
---
 drivers/gpu/drm/i915/selftests/i915_active.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/i915_active.c 
b/drivers/gpu/drm/i915/selftests/i915_active.c
index 0d89d70b9c36..a82a56c3eeb6 100644
--- a/drivers/gpu/drm/i915/selftests/i915_active.c
+++ b/drivers/gpu/drm/i915/selftests/i915_active.c
@@ -74,15 +74,25 @@ static struct live_active *__live_alloc(struct 
drm_i915_private *i915)
        return active;
 }
 
+static struct i915_sw_fence *submit;
+static struct delayed_work __live_submit_work;
+
+static void __live_submit_work_handler(struct work_struct *work)
+{
+       i915_sw_fence_commit(submit);
+       heap_fence_put(submit);
+}
+
 static struct live_active *
 __live_active_setup(struct drm_i915_private *i915)
 {
        struct intel_engine_cs *engine;
-       struct i915_sw_fence *submit;
        struct live_active *active;
        unsigned int count = 0;
        int err = 0;
 
+       INIT_DELAYED_WORK(&__live_submit_work, __live_submit_work_handler);
+
        active = __live_alloc(i915);
        if (!active)
                return ERR_PTR(-ENOMEM);
@@ -132,8 +142,7 @@ __live_active_setup(struct drm_i915_private *i915)
        }
 
 out:
-       i915_sw_fence_commit(submit);
-       heap_fence_put(submit);
+       schedule_delayed_work(&__live_submit_work, msecs_to_jiffies(500));
        if (err) {
                __live_put(active);
                active = ERR_PTR(err);
-- 
2.45.2

Reply via email to