|
@@ -404,6 +404,20 @@ static void execlists_submit_requests(struct drm_i915_gem_request *rq0,
|
|
|
spin_unlock_irq(&dev_priv->uncore.lock);
|
|
|
}
|
|
|
|
|
|
+static inline void execlists_context_status_change(
|
|
|
+ struct drm_i915_gem_request *rq,
|
|
|
+ unsigned long status)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Only used when GVT-g is enabled now. When GVT-g is disabled,
|
|
|
+ * The compiler should eliminate this function as dead-code.
|
|
|
+ */
|
|
|
+ if (!IS_ENABLED(CONFIG_DRM_I915_GVT))
|
|
|
+ return;
|
|
|
+
|
|
|
+ atomic_notifier_call_chain(&rq->ctx->status_notifier, status, rq);
|
|
|
+}
|
|
|
+
|
|
|
static void execlists_context_unqueue(struct intel_engine_cs *engine)
|
|
|
{
|
|
|
struct drm_i915_gem_request *req0 = NULL, *req1 = NULL;
|
|
@@ -439,6 +453,12 @@ static void execlists_context_unqueue(struct intel_engine_cs *engine)
|
|
|
if (unlikely(!req0))
|
|
|
return;
|
|
|
|
|
|
+ execlists_context_status_change(req0, INTEL_CONTEXT_SCHEDULE_IN);
|
|
|
+
|
|
|
+ if (req1)
|
|
|
+ execlists_context_status_change(req1,
|
|
|
+ INTEL_CONTEXT_SCHEDULE_IN);
|
|
|
+
|
|
|
if (req0->elsp_submitted & engine->idle_lite_restore_wa) {
|
|
|
/*
|
|
|
* WaIdleLiteRestore: make sure we never cause a lite restore
|
|
@@ -477,6 +497,8 @@ execlists_check_remove_request(struct intel_engine_cs *engine, u32 ctx_id)
|
|
|
if (--head_req->elsp_submitted > 0)
|
|
|
return 0;
|
|
|
|
|
|
+ execlists_context_status_change(head_req, INTEL_CONTEXT_SCHEDULE_OUT);
|
|
|
+
|
|
|
list_del(&head_req->execlist_link);
|
|
|
i915_gem_request_unreference(head_req);
|
|
|
|