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
