aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c38
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);