[Intel-gfx] [PATCH] drm/i915: Free requests after object release when retiring requests
Ben Widawsky
ben at bwidawsk.net
Fri Jan 10 00:39:30 CET 2014
On Tue, Jan 07, 2014 at 11:45:14AM +0000, Chris Wilson wrote:
> Freeing a request triggers the destruction of the context. This needs to
> occur after all objects are themselves unbound from the context, and so
> the free request needs to occur after the object release during retire.
>
> This tidies up
>
> commit e20780439b26ba95aeb29d3e27cd8cc32bc82a4c
> Author: Ben Widawsky <ben at bwidawsk.net>
> Date: Fri Dec 6 14:11:22 2013 -0800
>
> drm/i915: Defer request freeing
>
> by simply swapping the order of operations rather than introducing
> further complexity - as noted during review.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Ben Widawsky <ben at bwidawsk.net>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 47 ++++++++++++++++++-----------------------
> 1 file changed, 21 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index a5579a317b85..0a2055b736c4 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2560,8 +2560,6 @@ void i915_gem_reset(struct drm_device *dev)
> void
> i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
> {
> - LIST_HEAD(deferred_request_free);
> - struct drm_i915_gem_request *request;
> uint32_t seqno;
>
> if (list_empty(&ring->request_list))
> @@ -2571,7 +2569,27 @@ i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
>
> seqno = ring->get_seqno(ring, true);
>
> + /* Move any buffers on the active list that are no longer referenced
> + * by the ringbuffer to the flushing/inactive lists as appropriate,
> + * before we free the context associated with the requests.
> + */
> + while (!list_empty(&ring->active_list)) {
> + struct drm_i915_gem_object *obj;
> +
> + obj = list_first_entry(&ring->active_list,
> + struct drm_i915_gem_object,
> + ring_list);
> +
> + if (!i915_seqno_passed(seqno, obj->last_read_seqno))
> + break;
> +
> + i915_gem_object_move_to_inactive(obj);
> + }
> +
> +
> while (!list_empty(&ring->request_list)) {
> + struct drm_i915_gem_request *request;
> +
> request = list_first_entry(&ring->request_list,
> struct drm_i915_gem_request,
> list);
> @@ -2587,23 +2605,7 @@ i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
> */
> ring->last_retired_head = request->tail;
>
> - list_move_tail(&request->list, &deferred_request_free);
> - }
> -
> - /* Move any buffers on the active list that are no longer referenced
> - * by the ringbuffer to the flushing/inactive lists as appropriate.
> - */
> - while (!list_empty(&ring->active_list)) {
> - struct drm_i915_gem_object *obj;
> -
> - obj = list_first_entry(&ring->active_list,
> - struct drm_i915_gem_object,
> - ring_list);
> -
> - if (!i915_seqno_passed(seqno, obj->last_read_seqno))
> - break;
> -
> - i915_gem_object_move_to_inactive(obj);
> + i915_gem_free_request(request);
> }
>
> if (unlikely(ring->trace_irq_seqno &&
> @@ -2612,13 +2614,6 @@ i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
> ring->trace_irq_seqno = 0;
> }
>
> - /* Finish processing active list before freeing request */
> - while (!list_empty(&deferred_request_free)) {
> - request = list_first_entry(&deferred_request_free,
> - struct drm_i915_gem_request,
> - list);
> - i915_gem_free_request(request);
> - }
> WARN_ON(i915_verify_lists(ring->dev));
> }
>
> --
> 1.8.5.2
>
I had a reason for not doing this originally - but I can no longer
reconstruct what it was. Looking at it again now, it seems the only
difference is with setting ring->last_retired_head, with your patch that
gets set after the object is on the inactive list. Nothing seems wrong
with that, to me.
So with the caveat that I thought this was a bad idea at one point in
time:
Reviewed-by: Ben Widawsky <ben at bwidawsk.net>
--
Ben Widawsky, Intel Open Source Technology Center
More information about the Intel-gfx
mailing list