--- drivers/gpu/drm/i915/intel_guc_submission.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_guc_submission.c b/drivers/gpu/drm/i915/intel_guc_submission.c index eae668442ebe..c257eceef862 100644 --- a/drivers/gpu/drm/i915/intel_guc_submission.c +++ b/drivers/gpu/drm/i915/intel_guc_submission.c @@ -610,11 +610,13 @@ static void inject_preempt_context(struct work_struct *work) data[5] = guc->execbuf_client->stage_id; data[6] = intel_guc_ggtt_offset(guc, guc->shared_data); + local_bh_disable(); if (WARN_ON(intel_guc_send(guc, data, ARRAY_SIZE(data)))) { execlists_clear_active(&engine->execlists, EXECLISTS_ACTIVE_PREEMPT); tasklet_schedule(&engine->execlists.tasklet); } + local_bh_enable(); } /* @@ -654,11 +656,10 @@ static void complete_preempt_context(struct intel_engine_cs *engine) if (inject_preempt_hang(execlists)) return; + wait_for_guc_preempt_report(engine); + execlists_cancel_port_requests(execlists); execlists_unwind_incomplete_requests(execlists); - - wait_for_guc_preempt_report(engine); - intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0); } /** @@ -726,6 +727,9 @@ static bool __guc_dequeue(struct intel_engine_cs *engine) int prio = execlists->queue_priority; if (__execlists_need_preempt(prio, port_prio(port))) { + intel_write_status_page(engine, + I915_GEM_HWS_PREEMPT_INDEX, + 0); execlists_set_active(execlists, EXECLISTS_ACTIVE_PREEMPT); queue_work(engine->i915->guc.preempt_wq, @@ -816,8 +820,7 @@ static void guc_submission_tasklet(unsigned long data) } if (execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT) && - intel_read_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX) == - GUC_PREEMPT_FINISHED) + intel_read_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX)) complete_preempt_context(engine); if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT)) -- 2.19.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx