OSDN Git Service

drm/i915: Assert that the request is on the execution queue before being removed
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 22 Dec 2017 14:19:59 +0000 (14:19 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 22 Dec 2017 18:34:05 +0000 (18:34 +0000)
We should only attempt to remove requests from the execution queue that
are on the execution queue. These are the requests that have been
assigned a global_seqno, so we can assert that we only attempt to remove
requests with a nonzero global_seqno. Afterwards we assert that we
remove them in order, i.e. the global_seqno matches the engine's seqno,
but that leaves a small loophole for an unattached request on an unused
engine.

We can then make the same assertion on queuing the request to the
execution engine, it must have a zero global_seqno or else we are queuing
the same request twice.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: MichaƂ Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171222141959.3006-1-chris@chris-wilson.co.uk
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
drivers/gpu/drm/i915/i915_gem_request.c

index 59f023b..d575109 100644 (file)
@@ -479,6 +479,7 @@ void __i915_gem_request_submit(struct drm_i915_gem_request *request)
        /* Transfer from per-context onto the global per-engine timeline */
        timeline = engine->timeline;
        GEM_BUG_ON(timeline == request->timeline);
+       GEM_BUG_ON(request->global_seqno);
 
        seqno = timeline_get_seqno(timeline);
        GEM_BUG_ON(!seqno);
@@ -525,6 +526,7 @@ void __i915_gem_request_unsubmit(struct drm_i915_gem_request *request)
        /* Only unwind in reverse order, required so that the per-context list
         * is kept in seqno/ring order.
         */
+       GEM_BUG_ON(!request->global_seqno);
        GEM_BUG_ON(request->global_seqno != engine->timeline->seqno);
        engine->timeline->seqno--;