mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
drm/i915/execlists: Refactor -EIO markup of hung requests
Pull setting -EIO on the hung requests into its own utility function. Having allowed ourselves to short-circuit submission of completed requests, we can now do the mark_eio() prior to submission and avoid some redundant operations. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190923110056.15176-4-chris@chris-wilson.co.uk
This commit is contained in:
parent
c0bb487dc1
commit
0d7cf7bc15
@ -234,6 +234,13 @@ static void execlists_init_reg_state(u32 *reg_state,
|
||||
struct intel_engine_cs *engine,
|
||||
struct intel_ring *ring);
|
||||
|
||||
static void mark_eio(struct i915_request *rq)
|
||||
{
|
||||
if (!i915_request_signaled(rq))
|
||||
dma_fence_set_error(&rq->fence, -EIO);
|
||||
i915_request_mark_complete(rq);
|
||||
}
|
||||
|
||||
static inline u32 intel_hws_preempt_address(struct intel_engine_cs *engine)
|
||||
{
|
||||
return (i915_ggtt_offset(engine->status_page.vma) +
|
||||
@ -2517,12 +2524,8 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
|
||||
__execlists_reset(engine, true);
|
||||
|
||||
/* Mark all executing requests as skipped. */
|
||||
list_for_each_entry(rq, &engine->active.requests, sched.link) {
|
||||
if (!i915_request_signaled(rq))
|
||||
dma_fence_set_error(&rq->fence, -EIO);
|
||||
|
||||
i915_request_mark_complete(rq);
|
||||
}
|
||||
list_for_each_entry(rq, &engine->active.requests, sched.link)
|
||||
mark_eio(rq);
|
||||
|
||||
/* Flush the queued requests to the timeline list (for retiring). */
|
||||
while ((rb = rb_first_cached(&execlists->queue))) {
|
||||
@ -2530,9 +2533,8 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
|
||||
int i;
|
||||
|
||||
priolist_for_each_request_consume(rq, rn, p, i) {
|
||||
mark_eio(rq);
|
||||
__i915_request_submit(rq);
|
||||
dma_fence_set_error(&rq->fence, -EIO);
|
||||
i915_request_mark_complete(rq);
|
||||
}
|
||||
|
||||
rb_erase_cached(&p->node, &execlists->queue);
|
||||
@ -2548,13 +2550,14 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
|
||||
RB_CLEAR_NODE(rb);
|
||||
|
||||
spin_lock(&ve->base.active.lock);
|
||||
if (ve->request) {
|
||||
ve->request->engine = engine;
|
||||
__i915_request_submit(ve->request);
|
||||
dma_fence_set_error(&ve->request->fence, -EIO);
|
||||
i915_request_mark_complete(ve->request);
|
||||
rq = fetch_and_zero(&ve->request);
|
||||
if (rq) {
|
||||
mark_eio(rq);
|
||||
|
||||
rq->engine = engine;
|
||||
__i915_request_submit(rq);
|
||||
|
||||
ve->base.execlists.queue_priority_hint = INT_MIN;
|
||||
ve->request = NULL;
|
||||
}
|
||||
spin_unlock(&ve->base.active.lock);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user