Commit 6310346e authored by Chris Wilson's avatar Chris Wilson

drm/i915: Preallocate enough space for the average request

Rather than being interrupted when we run out of space halfway through
the request, and having to restart from the beginning (and returning to
userspace), flush a little more free space when we prepare the request.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1461833819-3991-15-git-send-email-chris@chris-wilson.co.uk
parent bfa01200
...@@ -700,6 +700,12 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request ...@@ -700,6 +700,12 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
{ {
int ret; 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; request->ringbuf = request->ctx->engine[request->engine->id].ringbuf;
if (i915.enable_guc_submission) { if (i915.enable_guc_submission) {
...@@ -725,6 +731,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request ...@@ -725,6 +731,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
if (ret) if (ret)
goto err_unpin; goto err_unpin;
request->reserved_space -= MIN_SPACE_FOR_ADD_REQUEST;
return 0; return 0;
err_unpin: err_unpin:
......
...@@ -2339,8 +2339,22 @@ int intel_engine_idle(struct intel_engine_cs *engine) ...@@ -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 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; 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) static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment