diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 4139858323513a742b930bb3f8baff829c9bc377..4dedeaa3c788ed5893fca1bbb104022a2c8ea6b6 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -700,6 +700,12 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request { int ret; + /* Flush enough space to reduce the likelihood of waiting after + * we start building the request - in which case we will just + * have to repeat work. + */ + request->reserved_space += MIN_SPACE_FOR_ADD_REQUEST; + request->ringbuf = request->ctx->engine[request->engine->id].ringbuf; if (i915.enable_guc_submission) { @@ -725,6 +731,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request if (ret) goto err_unpin; + request->reserved_space -= MIN_SPACE_FOR_ADD_REQUEST; return 0; err_unpin: diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index c2a699230809caa89bcdd865c29d12f42f6997f5..b5e79ac29ebc9e824a6855e009f88dac3e557522 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -2339,8 +2339,22 @@ int intel_engine_idle(struct intel_engine_cs *engine) int intel_ring_alloc_request_extras(struct drm_i915_gem_request *request) { + int ret; + + /* Flush enough space to reduce the likelihood of waiting after + * we start building the request - in which case we will just + * have to repeat work. + */ + request->reserved_space += MIN_SPACE_FOR_ADD_REQUEST; + request->ringbuf = request->engine->buffer; - return intel_ring_begin(request, 0); + + ret = intel_ring_begin(request, 0); + if (ret) + return ret; + + request->reserved_space -= MIN_SPACE_FOR_ADD_REQUEST; + return 0; } static int wait_for_space(struct drm_i915_gem_request *req, int bytes)