drm/i915: Preallocate enough space for the average request
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 28 Apr 2016 08:56:49 +0000 (09:56 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 28 Apr 2016 11:17:32 +0000 (12:17 +0100)
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: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1461833819-3991-15-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.c

index 4139858..4dedeaa 100644 (file)
@@ -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:
index c2a6992..b5e79ac 100644 (file)
@@ -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)