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))
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);
*/
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 &&
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));
}