[Intel-gfx] [RFC] drm/i915: reference count batch object on requests
Mika Kuoppala
mika.kuoppala at linux.intel.com
Mon Dec 2 16:31:53 CET 2013
We used to lean on active_list to handle the references
to batch objects. But there are useful cases when same,
albeit simple, batch can be executing on multiple rings
concurrently. For this case the active_list reference count
handling is just not enough as batch could be freed by
ring A request retirement as it is still running on ring B.
Fix this by doing proper batch_obj reference counting.
Signed-off-by: Mika Kuoppala <mika.kuoppala at intel.com>
Notes:
This is a patch which ameliorates the
[PATCH] tests/gem_reset_stats: add close-pending-fork
Chris wasn't happy about the refcounting as it might hide
the true problem. But I haven't been able to find the real culprit,
thus the RFC.
---
drivers/gpu/drm/i915/i915_gem.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 40d9dcf..858538f 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2145,13 +2145,12 @@ int __i915_add_request(struct intel_ring_buffer *ring,
request->head = request_start;
request->tail = request_ring_position;
- /* Whilst this request exists, batch_obj will be on the
- * active_list, and so will hold the active reference. Only when this
- * request is retired will the the batch_obj be moved onto the
- * inactive_list and lose its active reference. Hence we do not need
- * to explicitly hold another reference here.
+ /* Active list has one reference but that is not enough as same
+ * batch_obj can be active on multiple rings
*/
request->batch_obj = obj;
+ if (request->batch_obj)
+ drm_gem_object_reference(&request->batch_obj->base);
/* Hold a reference to the current context so that we can inspect
* it later in case a hangcheck error event fires.
@@ -2340,6 +2339,9 @@ static void i915_gem_free_request(struct drm_i915_gem_request *request)
if (request->ctx)
i915_gem_context_unreference(request->ctx);
+ if (request->batch_obj)
+ drm_gem_object_unreference(&request->batch_obj->base);
+
kfree(request);
}
--
1.7.9.5
More information about the Intel-gfx
mailing list