container_of(wrk, typeof(*engine), heartbeat.work.work);
        struct intel_context *ce = engine->kernel_context;
        struct i915_request *rq;
+       unsigned long serial;
 
        /* Just in case everything has gone horribly wrong, give it a kick */
        intel_engine_flush_submission(engine);
                goto out;
        }
 
-       if (engine->wakeref_serial == engine->serial)
+       serial = READ_ONCE(engine->serial);
+       if (engine->wakeref_serial == serial)
                goto out;
 
-       mutex_lock(&ce->timeline->mutex);
+       if (!mutex_trylock(&ce->timeline->mutex)) {
+               /* Unable to lock the kernel timeline, is the engine stuck? */
+               if (xchg(&engine->heartbeat.blocked, serial) == serial)
+                       intel_gt_handle_error(engine->gt, engine->mask,
+                                             I915_ERROR_CAPTURE,
+                                             "no heartbeat on %s",
+                                             engine->name);
+               goto out;
+       }
 
        intel_context_enter(ce);
        rq = __i915_request_create(ce, GFP_NOWAIT | __GFP_NOWARN);