|
@@ -2426,8 +2426,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))
|
|
@@ -2437,7 +2435,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);
|
|
@@ -2453,23 +2471,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 &&
|
|
@@ -2478,13 +2480,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));
|
|
|
}
|
|
|
|