serial = READ_ONCE(engine->serial); if (engine->wakeref_serial == serial) goto out;
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;
}
rq = heartbeat_create(ce, GFP_NOWAIT | __GFP_NOWARN); if (IS_ERR(rq)) goto unlock;
heartbeat_commit(rq, &attr);
unlock:
mutex_unlock(&ce->timeline->mutex);
out: if (!engine->i915->params.enable_hangcheck || !next_heartbeat(engine))
i915_request_put(fetch_and_zero(&engine->heartbeat.systole));
intel_engine_pm_put(engine);
}
void intel_engine_unpark_heartbeat(struct intel_engine_cs *engine)
{ if (!CONFIG_DRM_I915_HEARTBEAT_INTERVAL) return;
next_heartbeat(engine);
}
void intel_engine_park_heartbeat(struct intel_engine_cs *engine)
{ if (cancel_delayed_work(&engine->heartbeat.work))
i915_request_put(fetch_and_zero(&engine->heartbeat.systole));
}
old = xchg(&engine->props.heartbeat_interval_ms, delay); if (delay)
intel_engine_unpark_heartbeat(engine); else
intel_engine_park_heartbeat(engine);
return old;
}
int intel_engine_set_heartbeat(struct intel_engine_cs *engine, unsignedlong delay)
{ struct intel_context *ce = engine->kernel_context; int err = 0;
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); if (err) goto out_rpm;
if (delay != engine->props.heartbeat_interval_ms) { unsignedlong saved = set_heartbeat(engine, delay);
/* recheck current execution */ if (intel_engine_has_preemption(engine)) {
err = __intel_engine_pulse(engine); if (err)
set_heartbeat(engine, saved);
}
}
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.8Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-03)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.