diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c index 017cadf54d80c9518efdba6be248df5bcdaf570b..40978bc12cebf2054e95de464869d0da9558c80b 100644 --- a/drivers/gpu/drm/i915/i915_gem_request.c +++ b/drivers/gpu/drm/i915/i915_gem_request.c @@ -477,12 +477,13 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to, trace_i915_gem_ring_sync_to(to, from); if (!i915.semaphores) { - ret = i915_wait_request(from, - I915_WAIT_INTERRUPTIBLE | - I915_WAIT_LOCKED, - NULL, NO_WAITBOOST); - if (ret) - return ret; + if (!i915_spin_request(from, TASK_INTERRUPTIBLE, 2)) { + ret = i915_sw_fence_await_dma_fence(&to->submit, + &from->fence, 0, + GFP_KERNEL); + if (ret < 0) + return ret; + } } else { ret = to->engine->semaphore.sync_to(to, from); if (ret) @@ -577,6 +578,7 @@ void __i915_add_request(struct drm_i915_gem_request *request, bool flush_caches) { struct intel_engine_cs *engine = request->engine; struct intel_ring *ring = request->ring; + struct drm_i915_gem_request *prev; u32 request_start; u32 reserved_tail; int ret; @@ -631,6 +633,13 @@ void __i915_add_request(struct drm_i915_gem_request *request, bool flush_caches) * hangcheck. Hence we apply the barrier to ensure that we do not * see a more recent value in the hws than we are tracking. */ + + prev = i915_gem_active_raw(&engine->last_request, + &request->i915->drm.struct_mutex); + if (prev) + i915_sw_fence_await_sw_fence(&request->submit, &prev->submit, + &request->submitq); + request->emitted_jiffies = jiffies; request->previous_seqno = engine->last_submitted_seqno; engine->last_submitted_seqno = request->fence.seqno; diff --git a/drivers/gpu/drm/i915/i915_gem_request.h b/drivers/gpu/drm/i915/i915_gem_request.h index 883df3bdb3819301546850badc298fa9221ce6cd..974bd7bcc801f9bc7a6eb32003886b2c9b4c39be 100644 --- a/drivers/gpu/drm/i915/i915_gem_request.h +++ b/drivers/gpu/drm/i915/i915_gem_request.h @@ -84,6 +84,7 @@ struct drm_i915_gem_request { struct intel_signal_node signaling; struct i915_sw_fence submit; + wait_queue_t submitq; /** GEM sequence number associated with the previous request, * when the HWS breadcrumb is equal to this the GPU is processing