Hi Krzysztof,

On Friday, 24 October 2025 19:03:14 CET Krzysztof Niemiec wrote:
> 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.

For me your commit description still doesn't clarify why this patch is needed.  
Please describe the selftest expectations and explain what's wrong, in 
general, or the context of that selftest, with signalling the fence before the 
call to __i915_active_wait() and the callback not being called.  If possible, 
provide an example excerpt from system logs.

Thanks,
Janusz

> 
> 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);
> 




Reply via email to