|
@@ -1193,9 +1193,13 @@ static int __i915_spin_request(struct drm_i915_gem_request *req, int state)
|
|
* takes to sleep on a request, on the order of a microsecond.
|
|
* takes to sleep on a request, on the order of a microsecond.
|
|
*/
|
|
*/
|
|
|
|
|
|
- if (i915_gem_request_get_ring(req)->irq_refcount)
|
|
|
|
|
|
+ if (req->ring->irq_refcount)
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
|
|
|
|
|
|
+ /* Only spin if we know the GPU is processing this request */
|
|
|
|
+ if (!i915_gem_request_started(req, true))
|
|
|
|
+ return -EAGAIN;
|
|
|
|
+
|
|
timeout = local_clock_us(&cpu) + 5;
|
|
timeout = local_clock_us(&cpu) + 5;
|
|
while (!need_resched()) {
|
|
while (!need_resched()) {
|
|
if (i915_gem_request_completed(req, true))
|
|
if (i915_gem_request_completed(req, true))
|
|
@@ -1209,6 +1213,7 @@ static int __i915_spin_request(struct drm_i915_gem_request *req, int state)
|
|
|
|
|
|
cpu_relax_lowlatency();
|
|
cpu_relax_lowlatency();
|
|
}
|
|
}
|
|
|
|
+
|
|
if (i915_gem_request_completed(req, false))
|
|
if (i915_gem_request_completed(req, false))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
@@ -2600,6 +2605,7 @@ void __i915_add_request(struct drm_i915_gem_request *request,
|
|
request->batch_obj = obj;
|
|
request->batch_obj = obj;
|
|
|
|
|
|
request->emitted_jiffies = jiffies;
|
|
request->emitted_jiffies = jiffies;
|
|
|
|
+ request->previous_seqno = ring->last_submitted_seqno;
|
|
ring->last_submitted_seqno = request->seqno;
|
|
ring->last_submitted_seqno = request->seqno;
|
|
list_add_tail(&request->list, &ring->request_list);
|
|
list_add_tail(&request->list, &ring->request_list);
|
|
|
|
|