diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4ca3dab77fa4..d07c0b1fb498 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -2660,24 +2660,11 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring) | |||
2660 | 2660 | ||
2661 | WARN_ON(i915_verify_lists(ring->dev)); | 2661 | WARN_ON(i915_verify_lists(ring->dev)); |
2662 | 2662 | ||
2663 | /* Move any buffers on the active list that are no longer referenced | 2663 | /* Retire requests first as we use it above for the early return. |
2664 | * by the ringbuffer to the flushing/inactive lists as appropriate, | 2664 | * If we retire requests last, we may use a later seqno and so clear |
2665 | * before we free the context associated with the requests. | 2665 | * the requests lists without clearing the active list, leading to |
2666 | * confusion. | ||
2666 | */ | 2667 | */ |
2667 | while (!list_empty(&ring->active_list)) { | ||
2668 | struct drm_i915_gem_object *obj; | ||
2669 | |||
2670 | obj = list_first_entry(&ring->active_list, | ||
2671 | struct drm_i915_gem_object, | ||
2672 | ring_list); | ||
2673 | |||
2674 | if (!i915_gem_request_completed(obj->last_read_req, true)) | ||
2675 | break; | ||
2676 | |||
2677 | i915_gem_object_move_to_inactive(obj); | ||
2678 | } | ||
2679 | |||
2680 | |||
2681 | while (!list_empty(&ring->request_list)) { | 2668 | while (!list_empty(&ring->request_list)) { |
2682 | struct drm_i915_gem_request *request; | 2669 | struct drm_i915_gem_request *request; |
2683 | 2670 | ||
@@ -2700,6 +2687,23 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring) | |||
2700 | i915_gem_free_request(request); | 2687 | i915_gem_free_request(request); |
2701 | } | 2688 | } |
2702 | 2689 | ||
2690 | /* Move any buffers on the active list that are no longer referenced | ||
2691 | * by the ringbuffer to the flushing/inactive lists as appropriate, | ||
2692 | * before we free the context associated with the requests. | ||
2693 | */ | ||
2694 | while (!list_empty(&ring->active_list)) { | ||
2695 | struct drm_i915_gem_object *obj; | ||
2696 | |||
2697 | obj = list_first_entry(&ring->active_list, | ||
2698 | struct drm_i915_gem_object, | ||
2699 | ring_list); | ||
2700 | |||
2701 | if (!i915_gem_request_completed(obj->last_read_req, true)) | ||
2702 | break; | ||
2703 | |||
2704 | i915_gem_object_move_to_inactive(obj); | ||
2705 | } | ||
2706 | |||
2703 | if (unlikely(ring->trace_irq_req && | 2707 | if (unlikely(ring->trace_irq_req && |
2704 | i915_gem_request_completed(ring->trace_irq_req, true))) { | 2708 | i915_gem_request_completed(ring->trace_irq_req, true))) { |
2705 | ring->irq_put(ring); | 2709 | ring->irq_put(ring); |