drm/i915: Retire oldest completed request before allocating next
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Jul 2016 08:21:09 +0000 (09:21 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Jul 2016 08:29:53 +0000 (09:29 +0100)
In order to keep the memory allocated for requests reasonably tight, try
to reuse the oldest request (so long as it is completed and has no
external references) for the next allocation.

v2: Throw in a comment to hopefully make sure no one mistakes the
optimistic retirement of the oldest request for simply stealing it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1469002875-2335-2-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_request.c

index 9e9aa6b725f75940a3fd8079657c90874ab70e78..5cbb11ece60a07d598ec238f0fe7fc9af1cfc0a2 100644 (file)
@@ -226,6 +226,14 @@ __i915_gem_request_alloc(struct intel_engine_cs *engine,
        if (ret)
                return ret;
 
+       /* Move the oldest request to the slab-cache (if not in use!) */
+       if (!list_empty(&engine->request_list)) {
+               req = list_first_entry(&engine->request_list,
+                                      typeof(*req), list);
+               if (i915_gem_request_completed(req))
+                       i915_gem_request_retire(req);
+       }
+
        req = kmem_cache_zalloc(dev_priv->requests, GFP_KERNEL);
        if (!req)
                return -ENOMEM;