]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/gem: Set the watchdog timeout directly in intel_context_set_gem (v2)
authorJason Ekstrand <jason@jlekstrand.net>
Thu, 8 Jul 2021 15:48:09 +0000 (10:48 -0500)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 8 Jul 2021 17:43:49 +0000 (19:43 +0200)
Instead of handling it like a context param, unconditionally set it when
intel_contexts are created.  For years we've had the idea of a watchdog
uAPI floating about. The aim was for media, so that they could set very
tight deadlines for their transcodes jobs, so that if you have a corrupt
bitstream (especially for decoding) you don't hang your desktop too
hard.  But it's been stuck in limbo since forever, and this simplifies
things a bit in preparation for the proto-context work.  If we decide to
actually make said uAPI a reality, we can do it through the proto-
context easily enough.

This does mean that we move from reading the request_timeout_ms param
once per engine when engines are created instead of once at context
creation.  If someone changes request_timeout_ms between creating a
context and setting engines, it will mean that they get the new timeout.
If someone races setting request_timeout_ms and context creation, they
can theoretically end up with different timeouts.  However, since both
of these are fairly harmless and require changing kernel params, we
don't care.

v2 (Tvrtko Ursulin):
 - Add a comment about races with request_timeout_ms

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210708154835.528166-5-jason@jlekstrand.net
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/gem/i915_gem_context_types.h
drivers/gpu/drm/i915/gt/intel_context_param.h

index 5fc0eb4beeeae76306e2dce1d553c6117c23a2fd..9750a1ac7023e6470f5abc440f6fce9150880a2a 100644 (file)
@@ -232,7 +232,12 @@ static void intel_context_set_gem(struct intel_context *ce,
            intel_engine_has_timeslices(ce->engine))
                __set_bit(CONTEXT_USE_SEMAPHORES, &ce->flags);
 
-       intel_context_set_watchdog_us(ce, ctx->watchdog.timeout_us);
+       if (IS_ACTIVE(CONFIG_DRM_I915_REQUEST_TIMEOUT) &&
+           ctx->i915->params.request_timeout_ms) {
+               unsigned int timeout_ms = ctx->i915->params.request_timeout_ms;
+
+               intel_context_set_watchdog_us(ce, (u64)timeout_ms * 1000);
+       }
 }
 
 static void __free_engines(struct i915_gem_engines *e, unsigned int count)
@@ -791,41 +796,6 @@ static void __assign_timeline(struct i915_gem_context *ctx,
        context_apply_all(ctx, __apply_timeline, timeline);
 }
 
-static int __apply_watchdog(struct intel_context *ce, void *timeout_us)
-{
-       return intel_context_set_watchdog_us(ce, (uintptr_t)timeout_us);
-}
-
-static int
-__set_watchdog(struct i915_gem_context *ctx, unsigned long timeout_us)
-{
-       int ret;
-
-       ret = context_apply_all(ctx, __apply_watchdog,
-                               (void *)(uintptr_t)timeout_us);
-       if (!ret)
-               ctx->watchdog.timeout_us = timeout_us;
-
-       return ret;
-}
-
-static void __set_default_fence_expiry(struct i915_gem_context *ctx)
-{
-       struct drm_i915_private *i915 = ctx->i915;
-       int ret;
-
-       if (!IS_ACTIVE(CONFIG_DRM_I915_REQUEST_TIMEOUT) ||
-           !i915->params.request_timeout_ms)
-               return;
-
-       /* Default expiry for user fences. */
-       ret = __set_watchdog(ctx, i915->params.request_timeout_ms * 1000);
-       if (ret)
-               drm_notice(&i915->drm,
-                          "Failed to configure default fence expiry! (%d)",
-                          ret);
-}
-
 static struct i915_gem_context *
 i915_gem_create_context(struct drm_i915_private *i915, unsigned int flags)
 {
@@ -870,8 +840,6 @@ i915_gem_create_context(struct drm_i915_private *i915, unsigned int flags)
                intel_timeline_put(timeline);
        }
 
-       __set_default_fence_expiry(ctx);
-
        trace_i915_context_create(ctx);
 
        return ctx;
index 5ae71ec936f7cb64890adccbcbbe02a0209f7021..676592e27e7d2b3ae9ce87aca18f1aa34c624063 100644 (file)
@@ -153,10 +153,6 @@ struct i915_gem_context {
         */
        atomic_t active_count;
 
-       struct {
-               u64 timeout_us;
-       } watchdog;
-
        /**
         * @hang_timestamp: The last time(s) this context caused a GPU hang
         */
index dffedd983693d28795c7feb5c7283e6084b84186..0c69cb42d075c54d930bbf1ef938271f1a1ae56f 100644 (file)
 
 #include "intel_context.h"
 
-static inline int
+static inline void
 intel_context_set_watchdog_us(struct intel_context *ce, u64 timeout_us)
 {
        ce->watchdog.timeout_us = timeout_us;
-       return 0;
 }
 
 #endif /* INTEL_CONTEXT_PARAM_H */