static bool next_heartbeat(struct intel_engine_cs *engine)
 {
+       struct i915_request *rq;
        long delay;
 
        delay = READ_ONCE(engine->props.heartbeat_interval_ms);
+
+       rq = engine->heartbeat.systole;
+
+       /*
+        * FIXME: The final period extension is disabled if the period has been
+        * modified from the default. This is to prevent issues with certain
+        * selftests which override the value and expect specific behaviour.
+        * Once the selftests have been updated to either cope with variable
+        * heartbeat periods (or to override the pre-emption timeout as well,
+        * or just to add a selftest specific override of the extension), the
+        * generic override can be removed.
+        */
+       if (rq && rq->sched.attr.priority >= I915_PRIORITY_BARRIER &&
+           delay == engine->defaults.heartbeat_interval_ms) {
+               long longer;
+
+               /*
+                * The final try is at the highest priority possible. Up until now
+                * a pre-emption might not even have been attempted. So make sure
+                * this last attempt allows enough time for a pre-emption to occur.
+                */
+               longer = READ_ONCE(engine->props.preempt_timeout_ms) * 2;
+               longer = intel_clamp_heartbeat_interval_ms(engine, longer);
+               if (longer > delay)
+                       delay = longer;
+       }
+
        if (!delay)
                return false;
 
        if (!delay && !intel_engine_has_preempt_reset(engine))
                return -ENODEV;
 
+       /* FIXME: Remove together with equally marked hack in next_heartbeat. */
+       if (delay != engine->defaults.heartbeat_interval_ms &&
+           delay < 2 * engine->props.preempt_timeout_ms) {
+               if (intel_engine_uses_guc(engine))
+                       drm_notice(&engine->i915->drm, "%s heartbeat interval adjusted to a non-default value which may downgrade individual engine resets to full GPU resets!\n",
+                                  engine->name);
+               else
+                       drm_notice(&engine->i915->drm, "%s heartbeat interval adjusted to a non-default value which may cause engine resets to target innocent contexts!\n",
+                                  engine->name);
+       }
+
        intel_engine_pm_get(engine);
 
        err = mutex_lock_interruptible(&ce->timeline->mutex);